QWidget在matplotlib画布上抬起



我正在做一个项目,我有一个带有两个选项卡的 GUI(手动编码),在每个选项卡上我都有不同的画布(在每个选项卡中绘制不同的东西)。但是,我还在这些选项卡上添加了一些小部件,当我将它们添加到布局中时,例如,如果我在布局中按钮的相同位置添加画布,我可以再单击此按钮。我知道在 PyQt 上可以提高小部件的级别,那么有没有办法用画布做同样的事情?

提前感谢您的帮助。在此示例中,"退出"仅在右半部分处于活动状态。

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
class FenetrePrincipale(QWidget):
    def __init__(self, parent=None):
        super(FenetrePrincipale, self).__init__(parent)
        self.setupUi(self)
    # Fonction de configuration de la classe
    def setupUi(self, Form):
        self.Form = Form
        Form.setMinimumSize(1220, 850)
        self.creation_GUI()
        self.creation_figure()
        self.creation_layout()
        self.tabWidget.setCurrentIndex(0)
        self.Bouton_quitter.clicked.connect(self.close)
    def resizeEvent(self, QResizeEvent):
        self.tabWidget.setMinimumSize(QSize(self.width() - 20, self.height() - 60))
    def creation_GUI(self):
        self.tabWidget = QTabWidget()
        self.tab1 = QWidget()
        self.Widget_choixPalette_Label = QLabel(self.tab1)
        self.Widget_choixPalette_Label.setText("Text1")
        self.Widget_choixPalette_ComboBox = QComboBox(self.tab1)
        self.Widget_choixPalette_ComboBox.addItem("Try1")
        self.Widget_choixPalette_ComboBox.addItem("Try2")
        self.Bouton_quitter = QPushButton(self.tab1)
        self.Bouton_quitter.setText("Quit")
    def creation_layout(self):
        LayoutForm = QGridLayout(self.Form)
        LayoutG1 = QGridLayout()
        LayoutTab1 = QGridLayout(self.tab1)
        WidgetTemp = QWidget()
        LayoutWidgetTemp = QGridLayout()
        LayoutG1.addWidget(self.Bouton_quitter, 21, 29, 1, 2, Qt.AlignRight | Qt.AlignBottom)
        LayoutG1.addWidget(self.canvas, 2, 10, 20, 20)
        LayoutWidgetTemp.addWidget(self.Widget_choixPalette_Label, 0, 0, 1, 4)
        LayoutWidgetTemp.addWidget(self.Widget_choixPalette_ComboBox, 1, 0, 1, 4)
        WidgetTemp.setLayout(LayoutWidgetTemp)
        LayoutG1.addWidget(WidgetTemp, 1, 18, 2, 4)
        LayoutTab1.addLayout(LayoutG1, 0, 0, 1, 1)
        self.tabWidget.addTab(self.tab1, "  Tab1  ")
        LayoutForm.addWidget(self.tabWidget, 1, 0, 1, 1)
    def creation_figure(self):
        # Create figure (transparent background)
        self.figure = plt.figure()
        self.figure.patch.set_facecolor('None')
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setStyleSheet("background-color:transparent;")
        # Adding one subplot for image
        self.axe0 = self.figure.add_subplot(111)
        self.axe0.get_xaxis().set_visible(False)
        self.axe0.get_yaxis().set_visible(False)
        plt.tight_layout()
        # Data for init image
        self.imageInit = [[255] * 320 for i in range(240)]
        self.imageInit[0][0] = 0
        # Init image and add colorbar
        self.image = self.axe0.imshow(self.imageInit, interpolation='none')
        divider = make_axes_locatable(self.axe0)
        cax = divider.new_vertical(size="5%", pad=0.05, pack_start=True)
        self.colorbar = self.figure.add_axes(cax)
        self.figure.colorbar(self.image, cax=cax, orientation='horizontal')
        self.canvas.draw()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # QApplication.setStyle(QStyleFactory.create("plastique"))
    form = FenetrePrincipale()
    form.show()
    sys.exit(app.exec_())
  • 操作系统: 视窗 7 专业版
  • Matplotlib 版本:4.0.4
  • Matplotlib 后端:Qt5Agg
  • 蟒蛇版本:3.6
  • 其他库:PyQt5

编辑 25/10/17 :例如新代码

下面是修复

所有问题的示例脚本版本。大多数问题都是由布局的非常混乱的使用引起的。我不得不完全重写creation_layout方法以获得一个理智的起点,以便我可以看到问题所在。我还暂时恢复了画布的背景颜色,以便更容易看到小部件相对于彼此的布局方式。我意识到将我的一些更改合并到您的实际代码中并不容易。但希望它能给你一些关于如何简化布局结构的想法。

最重要的修复是在creation_figure方法中使用subplots_adjust。这将删除画布顶部的所有空白区域,因此不再需要尝试将其他小部件放置在其顶部。

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
class FenetrePrincipale(QWidget):
    def __init__(self, parent=None):
        super(FenetrePrincipale, self).__init__(parent)
        self.setupUi(self)
    # Fonction de configuration de la classe
    def setupUi(self, Form):
        self.Form = Form
        Form.setMinimumSize(1220, 850)
        self.creation_GUI()
        self.creation_figure()
        self.creation_layout()
        self.tabWidget.setCurrentIndex(0)
        self.Bouton_quitter.clicked.connect(self.close)
    def resizeEvent(self, QResizeEvent):
        self.tabWidget.setMinimumSize(QSize(self.width() - 20, self.height() - 60))
    def creation_GUI(self):
        self.tabWidget = QTabWidget()
        self.tab1 = QWidget()
        self.tabWidget.addTab(self.tab1, "  Tab1  ")
        self.Widget_choixPalette_Label = QLabel(self.tab1)
        self.Widget_choixPalette_Label.setText("Text1")
        self.Widget_choixPalette_ComboBox = QComboBox(self.tab1)
        self.Widget_choixPalette_ComboBox.addItem("Try1")
        self.Widget_choixPalette_ComboBox.addItem("Try2")
        self.Bouton_quitter = QPushButton(self.tab1)
        self.Bouton_quitter.setText("Quit")
    def creation_layout(self):
        LayoutForm = QGridLayout(self)
        LayoutForm.addWidget(self.tabWidget, 0, 0, 1, 1)
        LayoutTab1 = QGridLayout(self.tab1)
        LayoutTab1.addWidget(self.Widget_choixPalette_Label, 0, 1, 1, 1)
        LayoutTab1.addWidget(self.Widget_choixPalette_ComboBox, 1, 1, 1, 1)
        self.Widget_choixPalette_ComboBox.setMinimumWidth(200)
        LayoutTab1.addWidget(self.canvas, 2, 0, 1, 3)
        LayoutTab1.addWidget(self.Bouton_quitter, 2, 3, 1, 1, Qt.AlignRight | Qt.AlignBottom)
        LayoutTab1.setRowStretch(2, 1)
        LayoutTab1.setColumnStretch(0, 1)
        LayoutTab1.setColumnStretch(2, 1)
    def creation_figure(self):
        # Create figure (transparent background)
        self.figure = plt.figure()
        # self.figure.patch.set_facecolor('None')
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setStyleSheet("background-color:transparent;")
        # Adding one subplot for image
        self.axe0 = self.figure.add_subplot(111)
        self.axe0.get_xaxis().set_visible(False)
        self.axe0.get_yaxis().set_visible(False)
        # plt.tight_layout()
        # Data for init image
        self.imageInit = [[255] * 320 for i in range(240)]
        self.imageInit[0][0] = 0
        # Init image and add colorbar
        self.image = self.axe0.imshow(self.imageInit, interpolation='none')
        divider = make_axes_locatable(self.axe0)
        cax = divider.new_vertical(size="5%", pad=0.05, pack_start=True)
        self.colorbar = self.figure.add_axes(cax)
        self.figure.colorbar(self.image, cax=cax, orientation='horizontal')
        plt.subplots_adjust(left=0, bottom=0.05, right=1, top=1, wspace=0, hspace=0)
        self.canvas.draw()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # QApplication.setStyle(QStyleFactory.create("plastique"))
    form = FenetrePrincipale()
    form.show()
    sys.exit(app.exec_())

只需反转将内容添加到布局的顺序即可。首先添加画布,然后添加顶部的按钮

    LayoutForm.addWidget(canvas,1,0,1,6)
    LayoutForm.addWidget(button,1,0,1,2)

相关内容

  • 没有找到相关文章

最新更新