如何在 QTabWidget 上显示多光标?

Posted

技术标签:

【中文标题】如何在 QTabWidget 上显示多光标?【英文标题】:How to display multicursor on a QTabWidget? 【发布时间】:2018-07-26 16:29:00 【问题描述】:

The multicursor example

问题是:如果我希望绘图显示在 QTabWidget 的选项卡上,如何使 MultiCursor 工作?

# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
import numpy as np
import sys
from matplotlib.gridspec import GridSpec
from matplotlib.widgets import MultiCursor
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas    

class MainWindow(QMainWindow):

def __init__(self):

    super().__init__(flags=Qt.Window)
    self.setFont(QFont("Microsoft YaHei", 10, QFont.Normal))
    self.setMinimumSize(1550, 950)
    self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
    centralwidget = QWidget(flags=Qt.Widget)
    centralwidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    self.setCentralWidget(centralwidget)
    self.tabview = QTabWidget()
    self.tabview.currentChanged.connect(self.onchange)
    self.chart_widget0 = QWidget()
    self.chart_widget1 = QWidget()
    self.dc0 = my_Canvas(self.chart_widget0, width=20, height=8, dpi=100)
    self.dc1 = my_Canvas(self.chart_widget1, width=20, height=8, dpi=100)
    self.tabview.addTab(self.dc0, "MultiCursor")
    self.tabview.addTab(self.dc1, "Cursor")

    toplayout = QHBoxLayout()
    toplayout.addWidget(self.tabview)
    centralwidget.setLayout(toplayout)

def onchange(self,i):

    if i == 0:
        self.dc0.update_figure()
    elif i == 1:
        self.dc1.update_figure()

class my_Canvas(FigureCanvas):

def __init__(self, parent=None, width=10, height=7, dpi=100):

    self.fig = plt.figure(figsize=(width, height), dpi=dpi)
    gs = GridSpec(2, 1, height_ratios=[3, 1])
    self.axes1 = plt.subplot(gs[0])
    self.axes2 = plt.subplot(gs[1])

    self.compute_initial_figure()
    FigureCanvas.__init__(self, self.fig)
    self.setParent(parent)

def compute_initial_figure(self):

    self.axes1.cla()
    self.axes2.cla()

def update_figure(self):

    t = np.arange(0.0, 2.0, 0.01)
    s1 = np.sin(2*np.pi*t)
    s2 = np.sin(4*np.pi*t)
    self.axes1.plot(t, s1)
    self.axes2.plot(t, s2)
    multi = MultiCursor(self.fig.canvas, (self.axes1, self.axes2), color='r', lw=1)
    self.draw()

if __name__ == '__main__':
app = QApplication(sys.argv)
w1 = MainWindow()
w1.show()
sys.exit(app.exec_())

如何修改代码使MultiCursor工作,可以通过按键或鼠标控制光标的显示吗?

还有,如何用光标显示坐标?

【问题讨论】:

【参考方案1】:

正如Multicursor documentation 告诉我们的那样,

要使光标保持响应,您必须保留对它的引用。

最简单的方法是让它成为一个类变量,

self.multi = MultiCursor(...)

【讨论】:

谢谢!它现在可以工作了,我将学习使用“mpl_connect”通过鼠标按钮按下事件来控制MultiCursor的显示。

以上是关于如何在 QTabWidget 上显示多光标?的主要内容,如果未能解决你的问题,请参考以下文章

更改 QTabWidget 中选定选项卡的光标

如何确定一个点是不是在 QTabWidget 的 QTabBar 旁边?

Qt中QTabWidget动态添加页面的问题

如何使用 QWidget 在 QTabWidget 中包含 QList

如何使用 QPushButton 在现有 QTabWidget 上添加“新选项卡”

在 Qt 中,如何通过 qss 自定义如下 QTabWidget?