《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.
相关推荐
△曉風殘月〆3 小时前
如何在Linux中安装Qt开发环境
linux·运维·qt
Quz8 小时前
QML 选择控件:Switch、CheckBox 与 RadioButton
qt
熬夜苦读学习10 小时前
Qt常用控件
服务器·开发语言·qt
夏玉林的学习之路10 小时前
Qt 项目编译错误排查与解决记录
开发语言·qt
Quz1 天前
QML 基础按钮:Button、RoundButton 与 DelayButton
qt
Quz1 天前
QML ToolTip 组件:图标、多行文本与阴影
qt
xcyxiner1 天前
DicomViewer14(读取图像按固定窗宽窗位显示)
qt
马里马里奥-2 天前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
Quz2 天前
QML 与 JavaScript 交互方式:内联函数、外部文件、信号槽与工作线程
javascript·qt