Я собираюсь реализовать кроссплатформенную программу Qt. У меня есть одна проблема, которую я не понимаю: когда программа выполняется в Windows, я получаю неправильный цвет фона для некоторых виджетов. Во-первых, я написал программу на C ++ с теми же результатами, так что я думаю, что это не специфическая проблема Python.
Я сократил свой код до простой программы, которая показывает «ошибку». Я не уверен, какой виджет вызывает его, поэтому я просто включил все элементы, которые используются в реальной программе.
Вот как это выглядит в Linux:
И вот рендеринг Windows с неправильным фоном:
Вот код:
import sys
from PyQt4.QtGui import QApplication, QMainWindow, QVBoxLayout, QTabWidget, QWidget, \
QGroupBox, QVBoxLayout, QScrollArea, QFrame, QHBoxLayout, \
QGridLayout, QLabel
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
mainWidget = QWidget(self)
layout = QVBoxLayout(mainWidget)
self.setCentralWidget(mainWidget)
self.tabWidget = QTabWidget(self)
layout.addWidget(self.tabWidget)
self.scorePage = ScorePage()
self.tabWidget.addTab(self.scorePage, 'Some Tab')
self.scorePage.reload()
class GameWidget(QWidget):
def __init__(self):
super(GameWidget, self).__init__()
layout = QGridLayout(self)
boogerLabel = QLabel(self)
boogerLabel.setText('Some Text')
layout.addWidget(boogerLabel, 0, 0)
class ScorePage(QWidget):
def __init__(self):
super(ScorePage, self).__init__()
layout = QVBoxLayout(self)
self.scoreBox = QGroupBox(self)
self.scoreBoxLayout = QVBoxLayout(self.scoreBox)
layout.addWidget(self.scoreBox)
self.scoreBoxScroll = QScrollArea(self.scoreBox)
self.scoreBoxScroll.setFrameShape(QFrame.NoFrame)
self.scoreBoxLayout.addWidget(self.scoreBoxScroll)
self.scoreBoxWidget = QWidget(self)
def reload(self):
self.scoreBoxWidget.deleteLater()
self.scoreBoxWidget = QWidget(self)
self.scoreBoxWidgetLayout = QHBoxLayout(self.scoreBoxWidget)
newGame = GameWidget()
self.scoreBoxWidgetLayout.addWidget(newGame)
self.scoreBoxScroll.setWidget(self.scoreBoxWidget)
self.scoreBoxWidget.setAutoFillBackground(False)
def main(argv):
app = QApplication(sys.argv, True)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main(sys.argv)
Как я могу получить и установить правильный цвет фона (тот, что из QGroupBox)?
Заранее спасибо за всю помощь по этому поводу!
Эй, некоторое время назад я столкнулся с подобной проблемой и исправил ее, добавив стили Windows, которые отличаются от стилей по умолчанию:
Вот мой основной пример, который работает так, как вы хотите:
def main(argv):
app = QApplication(sys.argv, True)
from platform import system
if system() == "Windows":
app.setStyle(QStyleFactory.create("windows"))
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
QStyleFactory находится в QtGui, поэтому вы должны расширить свой импорт
Я наконец выяснил, что вызывает это. Это фон QScrollArea (который, вероятно, использует то же самое, что и QTabWidget в моей установке Linux, так что я его не видел).
Простое определение фона QScrollArea как прозрачного решает его:
self.scoreBoxScroll.setStyleSheet('QScrollArea { background-color: transparent; }')