《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.
相关推荐
布莱克6052 小时前
QtWidgets 与 QML:两大 UI 开发框架的全面对比
开发语言·c++·qt·ui·架构
qq_401700414 小时前
Qt 实时大数据量存储:自己动手实现 TDMS 读写
数据库·qt
NiceBlueChai4 小时前
Qt 跨线程传递多容器嵌套结构:一次 Release 实测
开发语言·qt
扶尔魔ocy4 小时前
【QT android】模仿行车记录仪案例
android·qt
zhanghaha131416 小时前
Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】
qt
Cx330❀1 天前
深入浅出 Qt 绘图机制:从 QPainter 到四大图像类解析
开发语言·qt·ui·性能优化·图形渲染
Littlehero_1211 天前
QT自定义控件之水泥厂组态(源码开源)
开发语言·qt
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
156082072191 天前
银河麒麟 Qt 可执行文件打包说明
开发语言·驱动开发·qt
Quz1 天前
QML GridView 布局:网格排布与排列方向
qt