2010-04-16 140 views
3

我正在使用QMessageBox中的很好的功能來有選擇地向用戶顯示詳細的文本。但是,擴展後的窗口仍然很小,並且立即嘗試調整窗口大小,以便可以看到更多細節。即使設置了我認爲合適的設置後,也不允許調整大小。如何允許在PyQt4中調整QMessageBox的大小

這裏是PyQt4的代碼中的相關片段:

mb = QMessageBox() 
mb.setText("Results written to '%s'" % filename) 
mb.setDetailedText(str(myData)) 
mb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 
mb.setSizeGripEnabled(True) 

我缺少一個步驟,並且/或者這是在所有可能的?

+0

你的意思是顯示QMessageBox提示的時候,它不是足夠大,以顯示你的內容(例如,事情正在被切斷)? – 2010-04-16 18:46:17

+0

對不起,我不清楚。我的意思是說詳細的文字侷限於一個*小*文本區域(帶滾動條)。從用戶角度來看,可以看到,但不令人愉快。如果'QMessageBox'只能根據用戶需要手動調整大小,那麼它將大大提高整體體驗。即使對'setSizePolicy()'和'setSizeGripEnabled()'的調用,仍然無法調整窗口大小。 – metasim 2010-04-16 19:11:20

+1

您是否嘗試過最低擴展尺寸政策? 除此之外,請檢查是否設置了maximumSize。您可能需要繼承QMessageBox並重新實現sizeHint()以返回所需內容。我總是發現有一點巫術涉及讓頂級窗口小部件根據其內容適當地重新調整自己的尺寸。你可以嘗試的另一件事是設置佈局的大小約束:'mb.layout() - > setSizeConstraint(QLayout :: SetMaximumSize)'(啊,這是C++ - 不熟悉Python語法) – 2010-04-16 20:08:37

回答

4

Th是我會用的解決方案。這不會使對話框可以調整大小,但它確實會使對話框在細節框可見時自動更改爲合理的大小。我毫不猶豫地從serge_gubenko的回答中竊取了一些想法。即使你寧願實施他的調整大小,我也會在下面虛心提供一些其他的改進。

# Safe since everything in the namespace begins with 'Q' 
from PyQt4.QtGui import * 

class MyMessageBox(QMessageBox): 

    # This is a much better way to extend __init__ 
    def __init__(self, *args, **kwargs):    
     super(MyMessageBox, self).__init__(*args, **kwargs) 
     # Anything else you want goes below 

    # We only need to extend resizeEvent, not every event. 
    def resizeEvent(self, event): 

     result = super(MyMessageBox, self).resizeEvent(event) 

     details_box = self.findChild(QTextEdit) 
     # 'is not' is better style than '!=' for None 
     if details_box is not None: 
      details_box.setFixedSize(details_box.sizeHint()) 

     return result 
+0

這在Linux上完全不起作用。但即使它確實有效,它也不會回答這個問題,因爲它不會使消息框可調整大小。 (PS:在這個例子中,'__init__'的重載是完全多餘的)。 – ekhumoro 2017-11-04 19:07:10

4

,如果你希望做一個可調整大小的消息框,請,請檢查下面的代碼會爲你工作:

class MyMessageBox(QtGui.QMessageBox): 
    def __init__(self): 
     QtGui.QMessageBox.__init__(self) 
     self.setSizeGripEnabled(True) 

    def event(self, e): 
     result = QtGui.QMessageBox.event(self, e) 

     self.setMinimumHeight(0) 
     self.setMaximumHeight(16777215) 
     self.setMinimumWidth(0) 
     self.setMaximumWidth(16777215) 
     self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 

     textEdit = self.findChild(QtGui.QTextEdit) 
     if textEdit != None : 
      textEdit.setMinimumHeight(0) 
      textEdit.setMaximumHeight(16777215) 
      textEdit.setMinimumWidth(0) 
      textEdit.setMaximumWidth(16777215) 
      textEdit.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 

     return result 

這裏的消息框怎麼叫:

mb = MyMessageBox() 
mb.setText("Results written to '%s'" % 'some_file_name') 
mb.setDetailedText('some text') 
mb.exec_() 

液被from here

希望對您有所幫助,敬請關注

+0

這絕對是在正確的軌道上(遺憾的是它必須在事件處理程序中完成)。該對話框現在會調整大小,但所有調整大小都會轉到頂部的標籤,而不是文本框。我花了大約半個小時的時間來玩設置其他組件的'sizePolicy'和底層佈局的'rowStretch',但沒有更進一步。這絕對比我擁有的要好。如果我想出如何給文本區域提供所有額外的垂直空間,我會發布後續內容。 – metasim 2010-04-19 14:04:15

+0

@serge_gubenko當我按下對話框上的最大化按鈕(當按下「顯示詳細信息」按鈕時顯示此按鈕)時,對話框會在一瞬間最大化,然後立即恢復正常(並移動到對話框的左上角屏幕)。任何想法如何最大化按鈕的工作是固定的? – 2013-07-10 09:02:30

0

這工作,但只在Linux上測試的Gnome 2下它只是水平重新調整,除非「顯示詳細信息」的文本被打開,在這種情況下,它會調整在兩個方向上。 「顯示詳細信息」按鈕,還是其重置爲初始大小,這可以是一個功能或者根據您的POV錯誤:

bool MyMessageBox::event(QEvent* e) 
{ 
    bool result = QMessageBox::event(e); 
    // force resizing back on, QMessageBox keeps turning it off: 
    if (maximumWidth() != QWIDGETSIZE_MAX) { 
     QTextEdit *textEdit = findChild<QTextEdit*>(); 
     if (textEdit && textEdit->isVisible()) { 
      textEdit->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
      textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
      setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
      setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
     } else { 
      setMaximumWidth(QWIDGETSIZE_MAX); 
      setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); 
     } 
    } 
    return result; 
} 
相關問題