2014-09-03 103 views
4

我有以下代碼:設置自動換行打破了大小限制爲窗口

import sys 
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 

TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \ 
     "Nullam malesuada tellus in ex elementum, vitae rutrum enim vestibulum." 

#============================================================================== 
class Window(QWidget): 
    def __init__(self, *args, **kwargs): 
     QWidget.__init__(self, *args, **kwargs) 

     # Widgets 
     self.label = QLabel(TEXT, self) 
#   self.label.setWordWrap(True)  
     self.text = QTextEdit(self) 
     self.text.setMinimumSize(480, 320) 
     self.text.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 

     # Layout 
     self.layout = QGridLayout() 
     self.layout.addWidget(self.label, 0, 0) 
     self.layout.addWidget(self.text, 1, 0) 
     self.layout.setContentsMargins(5, 5, 5, 5) 
     self.layout.setSpacing(5) 

     self.setLayout(self.layout) 

     self.adjustSize() 
     self.show()   

#============================================================================== 
if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    win = Window() 
    sys.exit(app.exec_()) 

它按預期工作,產生一個窗口,不能調整爲更小:

enter image description here

但是,當我取消對self.label.setWordWrap(True)行的註釋時,這些限制似乎消失。我可以調整窗口的大小更小,徹底打破了佈局,爲QTextEdit仍保留它的大小約束:

enter image description here

我試圖解決這個問題使用self.setMinimumSize(self.size())。這適用於這個特定的例子,但是如果尺寸較大,則會中斷,如self.text.setMinimumSize(480, 800)。這使得被創建,即使它的窗口太小,所以setMinimumSize沒有幫助:

enter image description here

有沒有辦法如何解決它,使窗口/佈局仍然匹配QTextEdit最小尺寸甚至什麼時候啓用自動換行?

版本信息:

OS: Windows-7-SP1 (32bit) 
Python: 3.4.1 
PyQt: 5.3.1 
Qt: 5.3.1 
+2

此問題在[文檔](http://qt-project.org/ doc/qt-5/layout.html#layout-issues)。還有一個[bug報告](https://bugreports.qt-project.org/browse/QTBUG-37673)。 – thuga 2014-09-03 12:58:11

+0

@thuga - 哇!謝謝我不會說等等。 – Fenikso 2014-09-03 13:01:08

+0

@thuga錯誤報告鏈接丟失,也許是這一個:https://bugreports.qt.io/browse/QTBUG-37673 – ismailsunni 2017-12-07 10:01:58

回答

3

由於@thuga提出的問題在docs提到的評論和已經reported,顯然與「不會/不能修復」的決議。

我找到了解決這個問題的提示here。它適用於我的示例和我的應用程序: self.setMinimumSize(self.sizeHint())

然後,代碼如下:

import sys 
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 

TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \ 
     "Nullam malesuada tellus in ex elementum, vitae rutrum enim vestibulum." 

#============================================================================== 
class Window(QWidget): 
    def __init__(self, *args, **kwargs): 
     QWidget.__init__(self, *args, **kwargs) 

     # Widgets 
     self.label = QLabel(TEXT, self) 
     self.label.setWordWrap(True)  
     self.text = QTextEdit(self) 
     self.text.setMinimumSize(480, 800) 
     self.text.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 

     # Layout 
     self.layout = QGridLayout() 
     self.layout.addWidget(self.label, 0, 0) 
     self.layout.addWidget(self.text, 1, 0) 
     self.layout.setContentsMargins(5, 5, 5, 5) 
     self.layout.setSpacing(5) 

     self.setLayout(self.layout) 

     self.setMinimumSize(self.sizeHint()) 
     self.show()  

#============================================================================== 
if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    win = Window() 
    sys.exit(app.exec_()) 
0

我也有這個問題,用QT 4.8,我不能升級我的QT,因爲我工作的QGIS 2.18仍然使用插件QT 4.8。

當調整尺寸發生時,我的工作是操縱QWebView(或者你的情況,你的QTextEdit)的maximumHeight。您將需要發出定製信號調整,因爲它不具備的QT(見:PyQt: Detect resizing in Widget-window resized signal

所以,我的代碼是這樣的:

class MetadataConverterDialog(QDialog): 
    resized = pyqtSignal() 
     # Adapted from https://stackoverflow.com/a/43126946/1198772 
    def resizeEvent(self, event): 
     """Emit custom signal when the window is re-sized. 

     :param event: The re-sized event. 
     :type event: QResizeEvent 
     """ 
     self.resized.emit() 
     return super(MetadataConverterDialog, self).resizeEvent(event) 

    def after_resize(self): 
     """Method after resizing the window.""" 
     max_height = self.height() - 275 # Magic number, to make it pretty 
     self.metadata_preview_web_view.setMaximumHeight(max_height) 

275是我需要的價值備用以正確顯示對話框(對於QWebView之前的窗口小部件,您需要找到適合您的對話框的值)