方法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(); // 阻塞直到窗口关闭