qt使用过程中的一些想法 您所在的位置:网站首页 qt界面更新卡顿 qt使用过程中的一些想法

qt使用过程中的一些想法

2023-03-04 10:21| 来源: 网络整理| 查看: 265

在使用c++进行桌面端开发时,我们可以选择的图像库有MFC,Qt等,其中Qt由于跨平台等优势,目前用c++配搭qt是比较好的选择。下面是我用qt开发过程中的一些经验和想法。

1:拖拽控件和手写代码布局的区别

用qt布局界面可以直接拖拽控件到界面,也可以手写代码进行布局。其中拖拽控件无疑很方便,但有时很难达到想要的效果,手写代码布局无疑很麻烦,要写很多布局代码,但是可以精确控制控件的位置等。我目前比较喜欢用手写代码来进行布局,而且拖拽控件方式我发现一个缺点,那就是在一台电脑上开发好,换到另一台电脑很容易出现控件被遮蔽、显示不全等问题。当然这时候调整分辨率和开发电脑一致,就能完整显示,但不可能换一台电脑,就改一次分辨率吧。而手写代码布局,这些控件放在布局器中,往往能自适应电脑大小。

2:子线程不能直接修改主线程中界面控件

一般我们会将耗时任务单独开一个线程,然后在这个子线程中执行这段耗时任务。但有时候我们可能需要在任务执行过程中,去更新ui控件属性,比如在子线程中得到一个值,然后将这个值填到ui控件框中,如果直接去更新ui控件就会报错,比如:

std::thread t1([=]{ int answer=Calc(); //假设Calc执行后会返回一个int值,然后我们将int值填到ui的lineEdit中 m_lineEdit->setText(QString::number(answer)); //m_lineEdit假设是主线程界面中的一个QLineEdit控件 }); t1.detach();

上面代码我们开启一个t1线程,然后在子线程中跟新ui控件,这时是会报错的,原因就是不能在子线程中去更新主界面ui控件,我们可以通过信号槽方式去通知主界面去更新ui控件,如下所示。

std::thread t1([=]{ int answer=Calc(); emit sig_updateLineEdit(answer); }); t1.detach(); //在主线程界面不要忘了绑定信号槽 connect(this,SIGNAL(sig_updateLineEdit(int)),this,SLOT(slot_updateLineEdit(int))); //主界面绑定 //槽函数实现 void MainWinndow::slot_updateLineEdit(int answer) { m_lineEdit->setText(QString::number(answer)); }

3:信号槽第五个参数

一般信号槽连接方式我们只需要关注前面四个参数就行,分别是信号发送者,发送的信号,信号接收者,执行的槽函数,第五个参数不填,默认为Qt::AutoConnection。其实还有以下几个:

Qt::DirectConnection, Qt::QueuedConnection,Qt::BlockingQueuedConnection。

其中AutoConnection会根据信号发送者和信号接收者是否在同一个线程,进而采用不同的连接方式。

如果信号发送者和信号接收者在同一个线程中,那么这时会采用Qt::DirectConnectio。这种方式下emit信号后,会立马去执行与信号绑定的槽函数,等槽函数执行完后,再去继续执行emit后面的语句,举例如下:

connect(btn,&QPushButton::clicked,[=](){ //假设btn是界面上的一个按钮,点击后会执行这段代码 emit sig_qDebug(); qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有