【QT】简单易懂,多控件提升为同一类后分别控制

您所在的位置:网站首页 qt自定义组合控件 【QT】简单易懂,多控件提升为同一类后分别控制

【QT】简单易懂,多控件提升为同一类后分别控制

2024-07-08 01:11| 来源: 网络整理| 查看: 265

        关于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