《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.
相关推荐
_林枭_7 小时前
ZW3D二次开发_原生表单_如何设置表单左上角图标
qt·zw3d
Quz12 小时前
QML 快捷键篇:基础快捷键与组合键序列
qt·qml
≮傷£≯√15 小时前
Qt 面试(一)
qt·ffmpeg·音视频
西西弗Sisyphus17 小时前
Qt 分类导航区的实现
开发语言·qt
galaxy_strive18 小时前
Qt C++插件化编写项目(1)
开发语言·c++·qt
kaixin_learn_qt_ing1 天前
Qt Model/View
qt
Quz1 天前
QML MouseArea:鼠标拖拽与滚轮缩放
qt·qml
CHPCWWHSU1 天前
DeepSeek-Harness-Qt将浏览器端Agent装入桌面应用
开发语言·qt
飘忽不定的bug2 天前
ubuntu20.04交叉编译QT5.15.12(RK3562+ubuntu20.04)
linux·qt·ubuntu
秋田君2 天前
Qt_QMediaPlayer类与QMediaPlaylist类
开发语言·qt