2012-01-23 55 views
2

我有一個大文本框的對話框。我希望用戶能夠最大化對話框。我已經嘗試下面的選項(XML_EditorQDialog實例):添加一個最大化按鈕到PyQt4對話框,並保持對話框居中父窗口

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上也可以工作,它將會很棒。

我欣賞任何提示。提前致謝。

+0

非常相似http://stackoverflow.com/questions/4699808/cant-add-minimize -button-to-qdialog-linux。沒有真正的解決方案:-( – krlmlr

回答

3

的各種窗口管理器將所有的行爲有所不同,所以這將是很難想出一個100%保證在所有情況下都能正常工作的解決方案。

在Linux上使用默認windowFlags KDE會產生一個帶有上下文,最大化,最小化和關閉按鈕的對話框;但在Windows XP中,只有上下文和關閉按鈕。

對於大多數平臺而言,至少需要設置WindowSystemMenuHintWindowMaximizeButtonHint標誌以確保存在最大化按鈕。

爲確保對話框始終居於父窗口的中心,只需在對話框的構造函數中傳遞對父對象的引用即可。

(請注意,組合標誌時,必須使用位或操作|。在你的例子,你用布爾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_()) 
+0

感謝關於'| | ',還有代碼。不幸的是,我的Unity版本仍然沒有成功。似乎依賴於窗口管理器,正如http://stackoverflow.com/questions/4699808/cant-add-minimize-button中所述-to-qdialog-under-linux。它可以可靠地使用'QtCore.Qt.Window'作爲窗口標誌,所以我想我會使用這個解決方案,因爲我的代碼庫已經包含了一個類似的案例。我會接受你的回答。 – krlmlr

0

試圖讓父窗口的幾何形狀,然後在對話框中移動到它的中心,是這樣的:在主平臺

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

感謝您的提示。在嘗試這個時,我意識到父窗口小部件不是主窗口。 – krlmlr

+0

對不起,這個解決方案對我來說不起作用 – krlmlr

相關問題