如何为 Matplotlib 小部件 (navBar/canvas) 设置 PyQT4 样式表?
How to set PyQT4 Stylesheet for Matplotlib widget (navBar/canvas)?
我有一个 QMainWindow 应用程序,它由一个菜单栏、中央小部件中的拆分器和一个状态栏组成。拆分器的左侧是一个包含一些控件(列表、组合和按钮)的小部件,右侧是一个包含 Matplotlib canvas 和 NavigationToolBar 布局的小部件。
我能够使用 QT 样式表设置所有内容的各种背景颜色...除了 Matplotlib 方面。我试图使用以下但它没有效果。我也试过直接设置 NavBar 和 Canvas 样式表……但还是没用:
self.mplFig.setStyleSheet(".QWidget {background-color: #0ff}")
基本上我试图改变 NavToolbar 的背景颜色和 canvas 周围的边框以匹配其他所有颜色(当前为青色,因此很容易显示)......
任何帮助,将不胜感激。完整代码和示例图片如下:
import sys
from PyQt4 import QtGui, QtCore
import matplotlib
matplotlib.use("qt4agg")
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class testGUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(testGUI, self).__init__(parent)
self.buildLayout()
self.buildMenus()
self.menuBar()
self.statusBar()
## Style Sheets
self.splitter.setStyleSheet("QSplitter::handle:horizontal {background-color: #ccc}")
self.controlWidget.setStyleSheet(".QWidget {background-color: #0ff}")
menuStyle = """.QMenuBar {background-color: #0ff}
QMenuBar::item {background: transparent}
QMenuBar::item:selected {background: #8ff}"""
self.statusBar().setStyleSheet(".QStatusBar {background-color: #0ff}")
self.menuBar().setStyleSheet(menuStyle)
# .....THIS DOESN"T WORK !! .....
self.mplFig.setStyleSheet(".QWidget {background-color: #0ff}")
def buildLayout(self):
self.controlWidget = QtGui.QWidget(self)
self.plotList = QtGui.QListWidget(self)
self.combo = QtGui.QComboBox(self)
self.button = QtGui.QPushButton('Plot')
self.combo.addItems(\['1','2','3','4'\])
layout = QtGui.QVBoxLayout()
layout.addWidget(self.plotList)
layout.addWidget(self.combo)
layout.addWidget(self.button)
self.controlWidget.setLayout(layout)
self.mplFig = MplGrapher()
self.splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
self.splitter.addWidget(self.controlWidget)
self.splitter.addWidget(self.mplFig)
self.setCentralWidget(self.splitter)
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Plastique'))
def buildMenus(self):
openFile = QtGui.QAction('Open', self)
self.fileMenu = self.menuBar().addMenu('&File')
self.fileMenu.addAction(openFile)
class MplGrapher(QtGui.QWidget):
def __init__(self,parent=None):
super(MplGrapher, self).__init__(parent)
self.initFigure()
def initFigure(self):
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.navbar = NavigationToolbar(self.canvas, self)
self.figure.add_subplot(1,1,1)
self.layout = QtGui.QVBoxLayout()
self.layout.addWidget(self.navbar)
self.layout.addWidget(self.canvas)
self.setLayout(self.layout)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = testGUI()
main.show()
sys.exit(app.exec_())
感谢 Maxwell Grady 的一些提示,我想我可能有一个解决方案。
我更改了以下两行:
self.mplFig.setStyleSheet("QWidget {background-color: #0ff}")
注意缺少“.”在 QWidget 和
之前
class MplGrapher(QtGui.QGroupBox):
修改后的GUI图片。现在我实际上可以设置一些样式属性了……是时候让它不那么丑陋了。
我有一个 QMainWindow 应用程序,它由一个菜单栏、中央小部件中的拆分器和一个状态栏组成。拆分器的左侧是一个包含一些控件(列表、组合和按钮)的小部件,右侧是一个包含 Matplotlib canvas 和 NavigationToolBar 布局的小部件。
我能够使用 QT 样式表设置所有内容的各种背景颜色...除了 Matplotlib 方面。我试图使用以下但它没有效果。我也试过直接设置 NavBar 和 Canvas 样式表……但还是没用:
self.mplFig.setStyleSheet(".QWidget {background-color: #0ff}")
基本上我试图改变 NavToolbar 的背景颜色和 canvas 周围的边框以匹配其他所有颜色(当前为青色,因此很容易显示)...... 任何帮助,将不胜感激。完整代码和示例图片如下:
import sys
from PyQt4 import QtGui, QtCore
import matplotlib
matplotlib.use("qt4agg")
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class testGUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(testGUI, self).__init__(parent)
self.buildLayout()
self.buildMenus()
self.menuBar()
self.statusBar()
## Style Sheets
self.splitter.setStyleSheet("QSplitter::handle:horizontal {background-color: #ccc}")
self.controlWidget.setStyleSheet(".QWidget {background-color: #0ff}")
menuStyle = """.QMenuBar {background-color: #0ff}
QMenuBar::item {background: transparent}
QMenuBar::item:selected {background: #8ff}"""
self.statusBar().setStyleSheet(".QStatusBar {background-color: #0ff}")
self.menuBar().setStyleSheet(menuStyle)
# .....THIS DOESN"T WORK !! .....
self.mplFig.setStyleSheet(".QWidget {background-color: #0ff}")
def buildLayout(self):
self.controlWidget = QtGui.QWidget(self)
self.plotList = QtGui.QListWidget(self)
self.combo = QtGui.QComboBox(self)
self.button = QtGui.QPushButton('Plot')
self.combo.addItems(\['1','2','3','4'\])
layout = QtGui.QVBoxLayout()
layout.addWidget(self.plotList)
layout.addWidget(self.combo)
layout.addWidget(self.button)
self.controlWidget.setLayout(layout)
self.mplFig = MplGrapher()
self.splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
self.splitter.addWidget(self.controlWidget)
self.splitter.addWidget(self.mplFig)
self.setCentralWidget(self.splitter)
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Plastique'))
def buildMenus(self):
openFile = QtGui.QAction('Open', self)
self.fileMenu = self.menuBar().addMenu('&File')
self.fileMenu.addAction(openFile)
class MplGrapher(QtGui.QWidget):
def __init__(self,parent=None):
super(MplGrapher, self).__init__(parent)
self.initFigure()
def initFigure(self):
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.navbar = NavigationToolbar(self.canvas, self)
self.figure.add_subplot(1,1,1)
self.layout = QtGui.QVBoxLayout()
self.layout.addWidget(self.navbar)
self.layout.addWidget(self.canvas)
self.setLayout(self.layout)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = testGUI()
main.show()
sys.exit(app.exec_())
感谢 Maxwell Grady 的一些提示,我想我可能有一个解决方案。
我更改了以下两行:
self.mplFig.setStyleSheet("QWidget {background-color: #0ff}")
注意缺少“.”在 QWidget 和
之前class MplGrapher(QtGui.QGroupBox):
修改后的GUI图片。现在我实际上可以设置一些样式属性了……是时候让它不那么丑陋了。