【QT】简单易懂,多控件提升为同一类后分别控制 |
您所在的位置:网站首页 › qt自定义组合控件 › 【QT】简单易懂,多控件提升为同一类后分别控制 |
关于Qt类的提升相关的文章很多,讲的都是如何提升某个widget的相关方法技巧,但在实际使用中会遇到这样的问题:同一ui界面多个控件提升为同一类后该如何分别控制? 这个问题还挺容易理解的,既然提升的目的是简化操作,那么多个控件提升为同一类后必然要面临分别操作的问题,网上没找到相关方法,自己摸索出来分享到这里供大家参考. 一、创建Qt标准工程 网上例子很多,不再赘述,默认操作就好 二、自定义类用于提升 1.右键项目标题,选择添加新文件,选择Qt-Qt设计师界面类 2.选择Widget并下一步 3.随便起个类的名字,这里起名为TinyTest,点击下一步 随后点击完成。此时供提升的类已经创建完成。 三、明确个人需求 将个人需求拆分梳理,假设我的需求是这样: 1.主UI界面上两个widget提升为TinyTest 2.TinyTest中放置Text Edit用于展示收到的信息 3.主UI界面上放置输入框Line Edit及按键,将信息输入到框中,按键可发送到对应widget 四、添加对应控件 1.TinyTest的UI界面为 2.主UI界面 为了便于分辨,我分别将两个widget放入了GroupBox中,GroupBox1中的起名为Widget1,GroupBox2中的起名为Widget2. 3.类的提升 将Widget1与Widget2分别提升为TinyTest,方法为右键Widget-提升为-输入类名。 注意勾选全局包含,这样下一次就无需重复输入类名了,选择添加并提升。 第二次提升就容易很多,直接选择即可。 运行程序看看初步效果。 可以看到已经提升成功。 五、撰写配套程序 想要实现分别控制两个widget,方法为提升类中添加相关函数,主程序中调用此函数,具体如下: 1.TinyTest程序中写入相应函数 #include "tinytest.h" #include "ui_tinytest.h" TinyTest::TinyTest(QWidget *parent) : QWidget(parent), ui(new Ui::TinyTest) { ui->setupUi(this); } TinyTest::~TinyTest() { delete ui; } void TinyTest::writeTextEdit(QString data) { ui->textEdit->setText(data); }这里的writeTextEdit函数便是自行添加的,这里仅添加一个功能,在TextEdit中写入数据,一定要注意,这里的自建函数只能放置于public中,否则主程序无法调用。 public: explicit TinyTest(QWidget *parent = nullptr); void writeTextEdit(QString data); ~TinyTest();2.主程序中写入相应函数 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //两个按键功能,具体差异为发出不同的信号 connect(ui->btnWidget1,&QPushButton::clicked,this,[=]() { QString data = ui->lineEdit->text(); emit sgnWriteWidget1(data); }); connect(ui->btnWidget2,&QPushButton::clicked,this,[=]() { QString data = ui->lineEdit->text(); emit sgnWriteWidget2(data); }); //使用按键发出的信号调用上部生成的函数 connect(this,&Widget::sgnWriteWidget1,ui->widget1,&TinyTest::writeTextEdit); connect(this,&Widget::sgnWriteWidget2,ui->widget2,&TinyTest::writeTextEdit); } Widget::~Widget() { delete ui; }这里需要注意的是,两个connect函数的receiver都需要填写为所提升的widget,这样才能达到分别控制的目的。简单理解为,提升后,原来TinyTest中的函数也就成为了Widget1和Widget2的函数,对应调用即可。 3.提升后效果 六、信号的区分 解决后多个widget提升到同一类后的分别控制问题后,自然会想到对应另一方面,多个widget提升到同一类后,发出的信号该如何区分呢,这里对应介绍一种办法: 1.对类进行简单改造,让其能发出信号: 对应改造程序为 #include "tinytest.h" #include "ui_tinytest.h" TinyTest::TinyTest(QWidget *parent) : QWidget(parent), ui(new Ui::TinyTest) { ui->setupUi(this); //发出信号 connect(ui->btnSendSgn,&QPushButton::clicked,this,[=]() { emit sgnTinyTestSend(); }); } TinyTest::~TinyTest() { delete ui; } void TinyTest::writeTextEdit(QString data) { ui->textEdit->setText(data); }也就是说,按下发出信号的按键后,提升类会发出sgnTinyTestSend()的信号,其他程序对应接收该信号即可。 2.使用多个connect函数接收 有多少个widget发出信号,就写多少个connect函数接收信号,一一对应,可写出如下测试程序: #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); connect(ui->btnWidget1,&QPushButton::clicked,this,[=]() { QString data = ui->lineEdit->text(); emit sgnWriteWidget1(data); }); connect(ui->btnWidget2,&QPushButton::clicked,this,[=]() { QString data = ui->lineEdit->text(); emit sgnWriteWidget2(data); }); connect(this,&Widget::sgnWriteWidget1,ui->widget1,&TinyTest::writeTextEdit); connect(this,&Widget::sgnWriteWidget2,ui->widget2,&TinyTest::writeTextEdit); //接收发出信号 connect(ui->widget1,&TinyTest::sgnTinyTestSend,this,[=]() { ui->lineEdit->setText("收到Widget1发出信号"); }); connect(ui->widget2,&TinyTest::sgnTinyTestSend,this,[=]() { ui->lineEdit->setText("收到Widget2发出信号"); }); } Widget::~Widget() { delete ui; }运行程序效果如下: 可以看出,程序正常运行,两个widget发出得到信号主界面均可以收到。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |