【问题标题】:Qt::Sheet and QMessageBox::show() on MacMac 上的 Qt::Sheet 和 QMessageBox::show()
【发布时间】:2012-09-02 02:36:40
【问题描述】:

我有一个应用程序,我想在 QMessageBox 中向用户提问,然后做出相应的回应。问题是在 Mac 上我希望对话框显示为工作表,但使用 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的信号吗?

【问题讨论】:

    标签: c++ macos qt qmessagebox


    【解决方案1】:

    文档recommends 使用setWindowModality() 代替。以下代码适用于我:

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

    【讨论】:

    • 但是 exec() 会使其成为“应用程序模式”,即应用程序的其他窗口都无法接收事件。如果你真的想在其他窗口接收事件,那么由于 QMessageBox 是一个 QDialog,你可以连接到 QDialog 的信号,然后调用 open()。
    【解决方案2】:

    这是我的应用程序中的 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
    

    【讨论】:

    • 感谢您的回复,但这并不能回答我的问题。使用静态方法 question() 在 Mac 上显示一个模式对话框(就像在 Windows 上一样),我想显示一个工作表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多