2012-10-05 111 views
4

我有一個帶有主「顯示」小部件的QMainWindow,以及一些次要小部件。我希望能夠在鼠標進入或離開窗口時打開/關閉小部件。Qt4:隱藏次要小部件,同時保持中央小部件的大小

我可以通過實現enterEventleaveEvent來調用顯示/隱藏不必要的小部件來實現此基本功能。但是,Qt4的默認行爲是保持QMainWindow幾何體不變,並調整重要的小部件大小。我寧願維護這個小部件的幾何圖形,並根據需要移動/調整QMainWindow的大小。這可能嗎?

這裏是PyQt4中

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

app = QApplication(['']) 

class MyWidget(QWidget): 
    def __init__(self, parent=None): 
     super(MyWidget, self).__init__(parent) 

     layout = QVBoxLayout() 
     self.setLayout(layout) 
     self.main = QPushButton("major") 
     self.main.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 
     self.minor = QPushButton("minor") 
     layout.addWidget(self.main) 
     layout.addWidget(self.minor) 

    def enterEvent(self, event): 
     self.minor.show() 

    def leaveEvent(self, event): 
     self.minor.hide() 

mw = QMainWindow() 
mw.setCentralWidget(MyWidget()) 
mw.show() 

app.exec_() 

取而代之的是「主要」按鈕增長/萎縮的一個簡單的例子,我想進myWidget的邊界更改爲環繞這個按鈕。

+0

你能顯示一些代碼嗎? – Junuxx

+0

@Junuxx當然,請參閱上文 – ChrisB

回答

1

我用PySide在Mac OS X上砍了你的例子。 嘗試了好一陣子後,我發現了以下解決方案:

from PySide.QtGui import * 
from PySide.QtCore import * 

app = QApplication(['']) 

class MyWidget(QWidget): 
    def __init__(self, parent=None): 
     super(MyWidget, self).__init__(parent) 

     layout = QVBoxLayout() 
     self.setLayout(layout) 
     self.main = QPushButton("major") 
     self.main.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 
     self.minor = QPushButton("minor") 
     layout.addWidget(self.main) 
     layout.addWidget(self.minor) 

    def resizeEvent(self, event): 
     self.appendix = self.minor.frameGeometry().height() + 2 
     if self.minor.isVisible(): 
      self.varheight = mw.height() - self.appendix 
     else: 
      self.varheight = mw.height() 

    def enterEvent(self, event): 
     self.minor.show() 
     mw.resize(mw.width(), self.varheight + self.appendix) 

    def leaveEvent(self, event): 
     self.minor.hide() 
     mw.resize(mw.width(), self.varheight) 

mw = QMainWindow() 
mw.setCentralWidget(MyWidget()) 
mw.show() 

app.exec_() 

這是不完美的,從初始狀態不檢查鼠標位置。 也可以從 控件幾何的其他一些度量中計算魔術「+ 2」。但對於這個例子,它應該沒問題。

該實施花了幾個小時才找到正確的。確保所有計算處於固定狀態的 至關重要。否則,佈局引擎將產生難以理解的結果或甚至無限循環的 。

resizeEvent從小部件大小中抓取正確的值,但沒有別的。 enterEventleaveEvent然後使用這些值並進行大小調整。

我的變量沒有被初始化。你可以做到這一點,但第一次調整比我們其他事件來得早。

0

你可以試試這段代碼。您可以直接繼承QMainWindow的子類,而不是子類化QWidget。

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class MyWindow(QMainWindow): 
    def __init__(self, parent = None): 
     QMainWindow.__init__(self, parent) 

     self.widget = QWidget(self) 
     lyt = QVBoxLayout() 

     self.main = QPushButton("major") 
     self.minor = QPushButton("minor") 

     if not self.underMouse() : 
      self.minor.hide() 
      self.setMaximumHeight(self.main.sizeHint().height()) 

     else : 
      self.setMaximumHeight(self.minor.sizeHint().height() + self.main.sizeHint().height()) 

     lyt.addWidget(self.main) 
     lyt.addWidget(self.minor) 

     self.widget.setLayout(lyt) 
     self.setCentralWidget(self.widget) 

    def enterEvent(self, event) : 

     self.minor.show() 
     self.setMaximumHeight(self.minor.sizeHint().height() + self.main.sizeHint().height()) 
     self.adjustSize() 

     event.accept() 

    def leaveEvent(self, event): 

     self.minor.hide() 
     self.setMaximumHeight(self.main.sizeHint().height()) 
     self.adjustSize() 

     event.accept() 

if __name__ == '__main__' : 

    app = QApplication([]) 

    Gui = MyWindow() 
    Gui.show() 

    app.exec_()