《QDebug 2026年6月》

一、Qt Widgets 问题交流

1.对话框exec嵌套时的显示问题

在槽函数中exec二级窗口,hide二级窗口后再exec三级窗口,三级窗口关闭时重新show二级窗口并没有显示出来,但是画面被模态阻塞了无法操作,且二级exec莫名直接退出了。

测试环境:Win11 + MSVC2022 + Qt5.15.2 / Qt6.11.0

测试代码:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    // 第一层槽函数
    qDebug()<<"begin 1";
    // Dialog是堆对象还是栈对象都是一样的现象
    QDialog dlg1;
    dlg1.setWindowTitle("dlg1");
    dlg1.setLayout(new QVBoxLayout());
    QPushButton *button = new QPushButton("Click");
    dlg1.layout()->addWidget(button);

    QObject::connect(button, &QPushButton::clicked, &dlg1,
                     [&]()
                     {
                         // 第二层槽函数
                         qDebug()<<"begin 2";
                         dlg1.hide();
                         QDialog dlg2;
                         dlg2.setWindowTitle("dlg2");
                         dlg2.exec();
                         // 此处show并没有显示出来,但是画面被模态阻塞了无法操作
                         // 且dlg1.exec异常结束
                         dlg1.show();
                         qDebug()<<"end 2";
                     });

    dlg1.exec();
    qDebug()<<"end 1";
}

先将QDialog栈对象改为new堆对象尝试,现象一致。然后测试QDialog.exec()拆解为QEventLoop.exec()+QDialog.open(),问题解决,其他伴生问题待测试

修改代码:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"begin 1";
    QEventLoop loop1;
    QDialog dlg1;
    dlg1.setWindowTitle("dlg1");
    dlg1.setLayout(new QVBoxLayout());
    QPushButton *button = new QPushButton("Click");
    dlg1.layout()->addWidget(button);

    QObject::connect(&dlg1, &QDialog::finished, &loop1, &QEventLoop::quit);
    QObject::connect(button, &QPushButton::clicked, &dlg1,
                     [&]()
                     {
                         qDebug()<<"begin 2";
                         dlg1.hide();
                         QDialog dlg2;
                         dlg2.setWindowTitle("dlg2");
                         dlg2.exec();
                         dlg1.show();
                         qDebug()<<"end 2";
                     });

    dlg1.open();
    loop1.exec();
    qDebug()<<"end 1";
}
2.connectSlotsByName遇到同名对象可能错误连接

通过on_objectName_signal函数命名方式建立信号槽连接,如果有同objectName的对象,就可能遇到连接错乱,比如其中一个对象触发了所有槽函数,另一个未连接到任何槽函数。最好还是手动connect建立信号槽连接,想要保证所有objectName不同维护也比较麻烦。

测试环境:Win11 + MSVC2022 + Qt5.15.2 / Qt6.11.0

QT BUG:https://qt-project.atlassian.net/browse/QTBUG-49749

二、Qt Quick 问题交流

1.

三、其他

1.
相关推荐
byxdaz4 小时前
QT中服务使用
开发语言·qt
秋田君13 小时前
QT_网络编程体系
网络·arm开发·qt
Quz13 小时前
QML TextArea 实战(下):大文本加载与性能优化
qt
Quz14 小时前
QML TextArea 实战(中):Markdown 渲染与保持滚动
qt
C++ 老炮儿的技术栈1 天前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
我不是疯子是傻子1 天前
Qt 实时曲线卡顿优化:从QPainter到OpenGL的3级加速实战
开发语言·qt
秋田君1 天前
QT_XML文件操作
xml·数据库·qt
我不是疯子是傻子1 天前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆1 天前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
CodeKwang2 天前
【三维TSP可视化】1000个点以内的最优路径:最近邻 + 2-opt + 3-opt 组合算法实战(Qt实现)
qt·算法