2011-08-23 135 views
3

我使用QSplitter,我發現一個小部件在 中的最小寬度是32像素(高23像素)。任何人都知道 如何改變這個默認值。換句話說,您不能拖動分離器,以便在spllitter中的 小部件之一(假設spillitter中有2個小部件)的寬度小於32像素。PYQT QSplitter問題

代碼:

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.initUI() 

    def initUI(self): 

     self.resize(400,400) 

     m = QtGui.QSplitter(self) 
     m.resize(200, 100) 

     x = QtGui.QPushButton(m) 
     x.setGeometry(0, 0, 100, 100) 

     y = QtGui.QPushButton(m) 
     y.setGeometry(0, 100, 100, 100) 


     m.setSizes([20, 180]) 
     # this will show you that the width of x is 32 (it should be 20!) 
     print x.width() 

回答

0

注:我使用Python 3.6.2和PyQt5,雖然本例中的邏輯保持不變,如果你正在使用的其他版本甚至可以理解Python和PyQt。

瞭解一下什麼是說here:

如果指定一個大小爲0,則部件將是不可見的。 小部件的大小策略被保留。也就是說,小於相應小部件的最小大小提示的值將被提示的值替換。

一個爲您解決問題的選項是調用x.setMinimumWidth()有一個很小的值,如:

x.setMinimumWidth(1) 

但是,如果你自己嘗試一下,你會看到

  1. 它是一個骯髒的黑客,因爲它實際離開這裏小部件,只是使它很窄,
  2. 雖然現在你可以拖動分離器時,Wi的初始寬度dget仍然是「32」而不是「20」。

x.setMinimumWidth(0)

也不能按預期工作:它的最小寬度實際上是零默認(如該部件有沒有內容,我猜),但它並不能幫助你使分割器項目寬度小於32像素,除非您摺疊它。

順便說一句,設置

m.setCollapsible(0, False) 
m.setCollapsible(1, False) 

,如果你想分路器停止其坍塌兩個孩子的小部件。更多細節here.

我已經找到了解決方法是重載要包括在分線器widget的sizeHint()方法,如下例所示的(看ButtonWrapper類是什麼樣的,現在輸出)。

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
#Python 3.6.2 and PyQt5 are used in this example 


from PyQt5.QtWidgets import (
    QPushButton, 
    QSplitter, 
    QWidget, 
    QApplication, 
) 

import sys 


class ButtonWrapper(QPushButton): 

    def sizeHint(self): 

     return self.minimumSize() 


class Example(QWidget): 

    def __init__(self): 

     super().__init__() 
     self.initUI() 

    def initUI(self): 

     self.resize(400, 400) 

     m = QSplitter(self) 
     m.resize(200, 100) 

     x = ButtonWrapper(self) 
     x.setGeometry(0, 0, 100, 100) 

     y = QPushButton(self) 
     y.setGeometry(0, 100, 100, 100) 

     m.addWidget(x) 
     m.addWidget(y) 

     m.setSizes([20, 180]) 

     #Now it really shows "20" as expected 
     print(x.width()) 

     #minimumWidth() is zero by default for empty QPushButton 
     print(x.minimumWidth()) 

     #Result of our overloaded sizeHint() method 
     print(x.sizeHint().width()) 
     print(x.minimumSizeHint().width()) 

     self.setWindowTitle('Example') 
     self.show() 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

我不知道這是否是做的東西以正確的方式,但我花了很多時間試圖解決我自己的問題連接到這一點,並沒有看到滿足咫尺天涯什麼。如果有人知道更好,我將非常感激實際工作&明確解決方法。