Qt 中将 QWidget 改为模态的方法

方法1:使用 setWindowModality()

复制代码
// 设置为应用程序模态(阻止与所有窗口交互)
widget->setWindowModality(Qt::ApplicationModal);

// 设置为窗口模态(只阻止与父窗口交互)
widget->setWindowModality(Qt::WindowModal);

// 设置为非模态
widget->setWindowModality(Qt::NonModal);

// 示例
QWidget* modalWidget = new QWidget();
modalWidget->setWindowModality(Qt::ApplicationModal);
modalWidget->show();

方法2:使用 exec() 方法(像 QDialog 一样)

复制代码
// 自定义 QWidget 子类,添加 exec() 方法
class ModalWidget : public QWidget {
    Q_OBJECT
public:
    ModalWidget(QWidget* parent = nullptr) : QWidget(parent) {
        setWindowFlags(Qt::Dialog);
        setWindowModality(Qt::ApplicationModal);
    }
    
    int exec() {
        show();
        m_eventLoop.exec();
        return m_result;
    }
    
public slots:
    void accept() {
        m_result = QDialog::Accepted;
        close();
    }
    
    void reject() {
        m_result = QDialog::Rejected;
        close();
    }
    
protected:
    void closeEvent(QCloseEvent* event) override {
        m_eventLoop.quit();
        QWidget::closeEvent(event);
    }
    
private:
    QEventLoop m_eventLoop;
    int m_result = QDialog::Rejected;
};

// 使用
ModalWidget* widget = new ModalWidget();
if (widget->exec() == QDialog::Accepted) {
    qDebug() << "用户接受了";
}

**方法3:使用setWindowModality+**QEventLoop

复制代码
    FormVideoSnap *widget = new FormVideoSnap(nullptr);
    widget->setWindowModality(Qt::ApplicationModal);
    widget->setAttribute(Qt::WA_DeleteOnClose);

    QEventLoop loop;
    // 连接自定义aboutToClose 信号
    QObject::connect(widget, &FormVideoSnap::aboutToClose, [this](const QString& filePath) {
        m_lastSnapshotFilePath = filePath;
    });
    QObject::connect(widget, &FormVideoSnap::destroyed, &loop, &QEventLoop::quit);
    widget->show();
    loop.exec(); // 阻塞直到窗口关闭
相关推荐
世转神风-5 小时前
qt-通信协议基础-QStirng转QByteArray-与字节序互动
开发语言·qt
特立独行的猫a6 小时前
QT开发鸿蒙PC应用:第一个Qt Widget应用入门
数据库·qt·harmonyos·鸿蒙pc·qtwidget
深蓝海拓6 小时前
PySide6从0开始学习的笔记(十八) MVC(Model-View-Controller)模式的图形渲染体系
笔记·python·qt·学习·pyqt
世转神风-6 小时前
qt-通信协议基础-固定长度-小端字节序补0x00指导
开发语言·qt
sunriver20008 小时前
【Qt】Ubantu安装Qt6.9.1
qt·ubuntu
Source.Liu8 小时前
【QOwnNotes】安装笔记
qt
枫叶丹48 小时前
【Qt开发】Qt事件(三)-> QMouseEvent 鼠标事件
c语言·开发语言·c++·qt·microsoft·计算机外设
草莓熊Lotso8 小时前
C++ 智能指针完全指南:原理、用法与避坑实战(从 RAII 到循环引用)
android·java·开发语言·c++·人工智能·经验分享·qt
qq_4663024517 小时前
vs2008 Hotlink实时数据读取
c++·qt