在Mac上,Qt::Sheet和QMessageBox::show()的作用是什么?

5

我有一个应用程序,在其中我想在QMessageBox中向用户提问,然后根据其回答做出相应反应。问题是,在Mac上,我希望将对话框显示为Sheet,但使用open()方法会立即返回。

QMessageBox* msgBox = new QMessageBox(
    QMessageBox::Question,
    "Delete Record?",
    "Are you sure you want to delete this record?"
    QMessageBox::Yes | QMessageBox::No,
    this,
    Qt::Sheet);

int ret = msgBox->exec(); // does not show up as a sheet on Mac
msgBox->open(); // shows up as a sheet but returns immediately

有没有办法在不实现自己的QDialog的情况下获得用户在工作表上按了哪个按钮? 是否可以从msgBox中连接到任何信号?

2个回答

5

文档建议使用setWindowModality()。以下代码对我有效:

auto m = new QMessageBox(&window);
m->setText("some text here");
m->setWindowModality(Qt::WindowModal);
m->exec();

但是使用exec()会使其“应用程序模态”,也就是说,应用程序的其他窗口无法接收事件。如果您真的想在其他窗口中接收事件,那么由于QMessageBox是一个QDialog,您可以连接到QDialog的信号,然后调用open()。 - bootchk

0
这是我的应用程序中的PyQt示例,但你可以理解其中的思路:
reply = QtGui.QMessageBox.question(self, 'Delete',
            "Are you sure?", QtGui.QMessageBox.Yes |
                QtGui.QMessageBox.No, QtGui.QMessageBox.No)
    if reply == QtGui.QMessageBox.Yes:
         #some action if YES clicked

1
谢谢您的回复,但这并没有回答我的问题。在Mac上使用静态方法question()会显示一个模态对话框(就像在Windows上一样),而我想显示一个Sheet。 - Addy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接