我使用 PySide6 和 Qt 设计器在 python 中构建了一个应用程序,其中我将 matplotlibWidget 添加到窗口
main_plot_container
并将 NavigationToolbar2QT 添加到位于 tb_frame
顶部的 main_plot_container
。我想通过将其移出绘图区域并为其提供自定义图标来自定义工具栏。一切都很好——这已经完成并且工作正常。我遇到的唯一问题是,当有人单击平移或缩放按钮/图标时,它们不会在视觉上表明它们处于活动状态(活动时请勿突出显示背景)。这会导致用户感到困惑,尝试单击其他按钮而不知道这些按钮已经处于活动状态。下面的代码片段说明了这是如何编码的。
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as Canvas
class MatplotlibWidget(QWidget):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(parent)
self.toolbar = NavigationToolbar(self.canvas, self)
self.figure, self.subplot_dict = plt.subplots()
self.canvas = Canvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.layout.addWidget(self.canvas)
....
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.mpl_widget = MatplotlibWidget(self.ui.main_plot_container)
self.ui.main_plot_container.layout().addWidget(self.mpl_widget)
self.ui.tb_frame.layout().addWidget(self.mpl_widget.toolbar)
icons_buttons = {
"Home": QtGui.QIcon(":/icons/icons/home.svg"),
"Pan": QtGui.QIcon(":/icons/icons/move.svg"),
"Zoom": QtGui.QIcon(":/icons/icons/zoom-in.svg"),
"Back": QtGui.QIcon(":/icons/icons/corner-up-left.svg"),
"Forward": QtGui.QIcon(":/icons/icons/corner-up-right.svg"),
"Save": QtGui.QIcon(":/icons/icons/save.svg"),
"Subplots": QtGui.QIcon(":/icons/icons/sliders.svg"),
"Customize": QtGui.QIcon(":/icons/icons/trending-up.svg")}
for action in self.toolbar.actions():
if action.text() in icons_buttons:
action.setIcon(icons_buttons.get(action.text(), QtGui.QIcon()))
....
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
python v3.11
matplotlib v3.7.4
PySide6 v6.5.1
Qt v6.5.1
我能够找到这个问题的根本原因。其他非导航工具栏按钮的 Qt QPushButton 和 QToolButton styleSheet 格式以某种方式导致了这种奇怪的行为。
QToolButton, QPushButton{
border: nine;}
我通过从格式中删除 QToolButtons 解决了这个问题。
QPushButton{
border: nine;}