![](/img/trans.png)
[英]how to Activate QLineEdit when QCheckBox pyqt5 qt designer is checked?
[英]show matplotlib plot when QCheckBox is checked with PyQt5
我想使用 PyQt5 制作一个 Gui 并显示 matplotlib 图。
下面是主window的图片:
问题是有什么方法可以在检查 QCheckBox 时显示 plot 吗? 我插入了 4 个复选框,每个复选框都有不同的图或不同的选项。 例如,其中 2 个将显示 2 个不同的图,其中两个将轴更改为对数坐标。
我知道在工具栏中有一个选项可以做到这一点,但我想通过单击复选框立即进行这些更改。
我使用 PyQt4 发现了这一点,但它使用 QPushhButton 进行更改。 我渴望立即改变。
而 matplotlib 的小部件和这个例子不适合我的 Gui。
有什么建议吗?
这是 qt 设计器中的代码和.ui 文件。 也许一些代码就足够了,因为我尝试了很多东西。 x 和 y 的两个样本列表。
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')
ui, _ = loadUiType('plots.ui')
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QMainWindow, ui):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self)
self.setupUi(self)
self.checkBox_1.stateChanged.connect(self.checker)
self.checkBox_2.stateChanged.connect(self.checker)
toolbar = NavigationToolbar(sc, self)
self.verticalLayout.addWidget(toolbar)
self.verticalLayout.addWidget(sc)
def checker(self):
x = [1,2,3,4,5]
y = [1,2,3,4,5]
if self.checkBox_1.isChecked():
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot(x, y)
self.show()
if self.checkBox_2.isChecked():
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot(x, y)
self.show()
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
main()
在努力研究这个问题后,我终于找到了解决方案。 但也许它编码太多我仍然可以从其他人那里得到建议。
这是我尝试过的:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')
ui, _ = loadUiType('plots.ui')
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QMainWindow, ui):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self)
self.setupUi(self)
self.checkBox_1.stateChanged.connect(self.raw)
self.checkBox_2.stateChanged.connect(self.raw)
def raw(self):
for i in range(self.verticalLayout.count()): self.verticalLayout.itemAt(i).widget().close()
x = [1,2,3,4,5]
y = [6,8,2,7,3]
sc = MplCanvas(self, width=5, height=4, dpi=100)
toolbar = NavigationToolbar(sc, self)
self.verticalLayout.addWidget(toolbar)
self.verticalLayout.addWidget(sc)
if self.checkBox_1.isChecked() and not self.checkBox_2.isChecked():
sc.axes.plot(x, y)
if self.checkBox_2.isChecked() and not self.checkBox_1.isChecked():
sc.axes.plot(y, x)
elif self.checkBox_2.isChecked() and self.checkBox_1.isChecked():
sc.axes.plot(x, y, 'r', y, x, 'b')
self.show()
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
main()
正如您在这段代码中看到的那样,每次在 state 和绘图的if statement
中更改复选框时,我都尝试清除布局。
我知道这样做有更好的方法,因此我可以使用您的宝贵建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.