2014-02-11 48 views
3

考慮以下示例代碼:(PY)的Qt:間距在QHBoxLayout,負責顯示centralwidget的背景,而不是父

from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QLabel, QWidget, 
          QMainWindow, QVBoxLayout, QTextEdit) 

class MainWindow(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     cwidget = QWidget(self) 
     cwidget.setStyleSheet("QWidget { background-color: red; }") 
     self.setCentralWidget(cwidget) 
     self.resize(100, 100) 

     vbox = QVBoxLayout(cwidget) 
     vbox.addWidget(QTextEdit(self)) 
     vbox.addWidget(BlackBar(self)) 

class BlackBar(QWidget): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setStyleSheet("* { background-color: black; color: white; }") 
     hbox = QHBoxLayout(self) 
     hbox.setSpacing(5) 
     hbox.addWidget(QLabel(text="eggs")) 
     hbox.addWidget(QLabel(text="bacon")) 

if __name__ == '__main__': 
    app = QApplication([]) 
    main = MainWindow() 
    main.show() 
    app.exec_() 

它具有:

  • QMainWindowQWidget中央微件(紅色 ),QVBoxLayout作爲中心小部件的孩子。裏面有:
    • 一個QTextEdit(只是作爲填充物)
    • 一個QWidget),其中包含一個QHBoxLayout。裏面是:
      • 兩個QLabels

這看起來是這樣的:

Qt HBoxLayout

我期望標籤之間的空間是黑色的,因爲QHBoxLayoutBlackBar的孩子,但似乎是BlackBar只是「隱形」之間的中心部件「閃耀」。爲什麼是這樣?

回答

3

bugreport現在已經回答了一個解決方案,它比@ ekhumoro的回答更簡單,工作原理:

我不認爲這是有效的。您正在查找的塗料代碼未在paintEvent中繪製。改爲尋找QWidgetPrivate::paintBackground。出於性能方面的原因,小部件默認會忽略樣式表,但您可以在小部件上設置WA_StyledBackground屬性,並且它應該遵守樣式表背景。

事實上,設置樣式表之前這樣做的伎倆:

self.setAttribute(Qt.WA_StyledBackground) 
2

雖然Style Sheet Syntax沒有提到它,但看起來QWidget類對於樣式表的處理方式不同。

其他小部件可以在您的示例代碼中正常工作。例如,如果QWidget被替換爲QFrame,則所有內容都按預期工作。

要獲得QWidget子樣式表的支持,你需要重新實現paintEvent並明確啓用它:

class BlackBar(QWidget): 
... 
    def paintEvent(self, event): 
     option = QStyleOption() 
     option.initFrom(self) 
     painter = QPainter(self) 
     self.style().drawPrimitive(
      QStyle.PE_Widget, option, painter, self) 
+0

有趣 - 我只是看着Qt的來源,[QWidget的(https://qt.gitorious.org/ qt/qt/source/763f4e54a818f31b4e89c99ec10924b2738f5de6:src/gui/kernel/qwidget.cpp)根本沒有實現paintEvent。我是否錯過了某些東西,或者我應該提交一個Qt錯誤,所以這個錯誤要麼被修改,要麼文檔被澄清? –

+0

@ TheCompiler。這看起來很奇怪,我必須承認我沒有得到明確的答案。我的理解是,這隻會影響QWidget的_subclasses_,但我不記得我從哪裏得到這些信息。 – ekhumoro

+0

我現在將其作爲[QTBUG-36884](https://bugreports.qt-project.org/browse/QTBUG-36884)提交。讓我們看看他們說什麼。 –