matplotlib во втором окне pyqt5 - PullRequest
       7

matplotlib во втором окне pyqt5

0 голосов
/ 06 сентября 2018

Я хочу построить график matplotlib во втором окне при нажатии кнопки в главном окне. Используя https://matplotlib.org/examples/user_interfaces/embedding_in_qt4.html, который отображает график в главном окне, я написал код ниже. График matplotlib действительно отображается во втором окне, но он имеет очень маленький размер, и я не понимаю, как настроить размер графика в соответствии с окном. Можно мне помочь?

from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QLabel, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt5 import QtCore, QtWidgets
import numpy as np

class MainWindow(QMainWindow):
     def __init__(self):
          super(MainWindow, self).__init__()
          btn = QPushButton('Click me!', self)
          btn.clicked.connect(self.onClick)

     def onClick(self):
          self.SW = SecondWindow()
          self.SW.resize(300,300)
          self.SW.show()

class SecondWindow(QMainWindow):
    def __init__(self):
         super(SecondWindow, self).__init__()
         self.main_widget = QtWidgets.QWidget(self)

         layout = QtWidgets.QVBoxLayout(self.main_widget)
         sc = MyMplCanvas(self.main_widget, width = 300, height = 300)
         layout.addWidget(sc)

class MyMplCanvas(FigureCanvas):

    def __init__(self, parent=None, width= 300, height= 300):
        fig = Figure(figsize=(width, height))
        self.axes = fig.add_subplot(111)

        self.compute_figure()

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

        FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_figure(self):
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2*np.pi*t)
        self.axes.plot(t, s)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    MW = MainWindow()
    MW.resize(500, 500)
    MW.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 06 сентября 2018

В вашем случае main_widget не имеет такой же размер, как QMainWindow, поэтому, если вы измените размер с помощью self.SW.resize(300,300), это не изменит размер self.main_widget, решение будет использовать макет, но в случае QMainWindow это неправильно, так как это имеет пользовательский макет, который не должен изменяться:

enter image description here

Решение в случае QMainWindow всегда заключается в создании централизованного виджета, в вашем случае это может быть использование self.main_widget:

class SecondWindow(QMainWindow):
    def __init__(self):
         super(SecondWindow, self).__init__()
         self.main_widget = QtWidgets.QWidget()
         self.setCentralWidget(self.main_widget)

         layout = QtWidgets.QVBoxLayout(self.main_widget)
         sc = MyMplCanvas(self.main_widget, width = 300, height = 300)
         layout.addWidget(sc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...