【问题标题】:Add a Maximize button to a PyQt4 dialog and keep the dialog centered to the parent window将最大化按钮添加到 PyQt4 对话框并保持对话框居中于父窗口
【发布时间】:2012-02-16 16:06:49
【问题描述】:

我有一个带有大文本框的对话框。我希望用户能够最大化对话框。我已经尝试了以下选项(XML_EditorQDialog 实例):

XML_Editor.setWindowFlags(QtCore.Qt.Window or QtCore.Qt.WindowMaximizeButtonHint) -- 显示最大化按钮,但不将对话框 w.r.t 居中。不再是父母了

XML_Editor.setWindowFlags(QtCore.Qt.Dialog or QtCore.Qt.WindowMaximizeButtonHint or QtCore.Qt.CustomizeWindowHint) -- 无效

现在我的问题是:如何实现最大化按钮的显示和对话框以 w.r.t 为中心弹出。父母?网络上的大多数资源似乎都集中在如何摆脱“最大化”按钮上。任何想法如何实现相反的效果?

主要目标是 Ubuntu 10.04(默认配置),如果它也能在 Windows 和 Mac 上运行,那就太好了。

我很感激任何提示。提前致谢。

【问题讨论】:

标签: ubuntu qt4 dialog pyqt pyqt4


【解决方案1】:

主要平台上的各种窗口管理器的行为都会有所不同,因此很难想出一个 100% 保证在所有情况下都能正常工作的解决方案。

在 Linux KDE 上使用 default windowFlags 会生成一个带有上下文、最大化、最小化和关闭按钮的对话框;但在 Windows XP 中,只有一个上下文和关闭按钮。

对于大多数平台,似乎至少需要设置 WindowSystemMenuHintWindowMaximizeButtonHint 标志以确保存在最大化按钮。

要确保对话框保持在父窗口的中心,只需在对话框的构造函数中传递对父窗口的引用即可。

(请注意,在组合标志时,您必须使用 bitwise OR 运算符|。在您的示例中,您使用 boolean OR 运算符or,这将选择第一个非零值,但忽略其他值)。

以下示例在 Linux KDE 和 Windows XP 上为我生成了一个带有最大化按钮的居中对话框:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Show Dialog', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.button)

    def handleButton(self):
        dialog = QtGui.QDialog(self)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.setWindowFlags(dialog.windowFlags() |
                              QtCore.Qt.WindowSystemMenuHint |
                              QtCore.Qt.WindowMinMaxButtonsHint)
        dialog.resize(160, 120)
        dialog.show()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    window.resize(320, 240)
    sys.exit(app.exec_())

【讨论】:

  • 感谢您对| 以及代码的澄清。不幸的是,我的 Unity 版本仍然没有成功。似乎依赖于窗口管理器,如stackoverflow.com/questions/4699808/… 中所述。它以QtCore.Qt.Window 作为窗口标志可靠地工作,所以我想我会使用这个解决方案,因为我的代码库已经包含类似的情况。我会接受你的回答。
  • 在 PyQt5 中的 Manjaro Cinnamon 中将 dialog.windowFlags() 替换为 Qt.Window 对我有用。
【解决方案2】:

尝试获取父窗口的几何图形,然后将对话框移动到其中心,例如:

QRect pw = parent_widget->getGeometry();
XML_Editor.move(pw.center() - XML_Editor->rect().center());

【讨论】:

  • 感谢您的提示。在尝试这个时,我意识到父小部件不是主窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多