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(); // 阻塞直到窗口关闭
相关推荐
mabing9934 小时前
Qt 生成条纹图
开发语言·qt
Fu_Lin_4 小时前
Qt 嵌入式从零基础到精通总纲
开发语言·qt·嵌入式·qt嵌入式
茯苓gao6 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
Lyndon-李大鹏8 小时前
QT-VS环境
开发语言·qt
神仙别闹11 小时前
基于QT(C++)实现Windows 自启动项查看和分析
c++·windows·qt
小许同学记录成长12 小时前
QGIS二次开发技术文档
图像处理·qt·信息可视化·无人机
初阳7852 天前
【Qt】SQLite——数据库介绍
数据库·qt·sqlite
Quz2 天前
QML 信号与槽:直接绑定与跨文件通信
qt·编程语言·设计
GIS阵地2 天前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
丰锋ff2 天前
1.2 Qt常用基础类型
开发语言·qt