《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.
相关推荐
Quz9 小时前
QML Flickable:内容滚动与边界行为
qt
Quz9 小时前
QML Flipable:卡片翻转与登录设置
qt
阿钱真强道17 小时前
24 嵌入式操作系统 | 项目启动与环境准备(PyQt5 / Flask 两个“最小可跑“)
开发语言·qt·flask·架构设计·协议契约
物极必反102420 小时前
QT使用FFMpeg编译安卓程序.md
qt·ffmpeg·安卓
励志不掉头发的内向程序员1 天前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
sycmancia2 天前
Qml——第一个qml的程序
qt
实心儿儿2 天前
Qt — Qt 多线程
开发语言·qt
沫璃染墨2 天前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
实心儿儿2 天前
Qt — Qt 窗口
开发语言·qt
Quz2 天前
QML 滚动条:自定义滚动样式与滚动逻辑
qt