簡體   English   中英

PyQt 中小部件的放置順序:我可以在 QHBoxLayout 上放置一個 GraphicalLayoutWidget 嗎?

[英]Order of placement of widgets in PyQt: Can I place a GraphicalLayoutWidget on a QHBoxLayout?

我是 PyQt 和 pyqtgraph 的新手,並且有一個熱圖,我想將其放在一個小部件上(如果這是正確的術語),最終會出現一個 slider。 到目前為止,我的代碼是對我無恥地從在線教程中復制的內容的修改,如下所示:

import pyqtgraph as pg
from pyqtgraph.Qt import QtWidgets, mkQApp
from PyQt5.QtWidgets import QHBoxLayout

from pyqtgraph.Qt import QtGui, QtCore

pg.setConfigOption('background', 'lightgray')
pg.setConfigOption('foreground','black')

font = QtGui.QFont("Times", 18)

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
   
        layout = QHBoxLayout()

        graph_widget = pg.GraphicsLayoutWidget(show=True)
        self.setCentralWidget(graph_widget)
    
        self.setWindowTitle('pyqtgraph example: heatmap display')
        self.setStyleSheet("background-color: lightgray;")
        self.resize(1000,1000)

        #layout.addWidget(graph_widget) # Where my error occurs

        self.show()

        corrMatrix = np.array([
            [ 1.        ,  0.5184571 , -0.70188642],
            [ 0.5184571 ,  1.        , -0.86094096],
            [-0.70188642, -0.86094096,  1.        ]
        ])
        columns = ["A", "B", "C"]

        pg.setConfigOption('imageAxisOrder', 'row-major') 
    
        correlogram = pg.ImageItem()

        tr = QtGui.QTransform().translate(-0.5, -0.5) 
        correlogram.setTransform(tr)
        correlogram.setImage(corrMatrix)

        plotItem = graph_widget.addPlot() 
    
        plotItem.invertY(True)           
        plotItem.setDefaultPadding(0.0)  
        plotItem.addItem(correlogram)    
    
        plotItem.showAxes( True, showValues=(True, True, False, False), size=40 )

        ticks = [ (idx, label) for idx, label in enumerate( columns ) ]
        for side in ('left','top','right','bottom'):
            plotItem.getAxis(side).setTicks( (ticks, []) ) 
            plotItem.getAxis(side).setTickFont(font) 
        plotItem.getAxis('bottom').setHeight(10) 
           
        colorMap = pg.colormap.get("CET-D1")     
        bar = pg.ColorBarItem( interactive=False,values=(0,1), colorMap=colorMap)
        bar.setImageItem(correlogram, insert_in=plotItem)    

mkQApp("Correlation matrix display")
main_window = MainWindow()

if __name__ == '__main__':
    pg.exec()

結果如下圖:

在此處輸入圖像描述

最后,我想將上面的內容放在一個布局中,其中一行包含我的 plot、一個 slider(以及其他一些小部件)。 當我取消對layout.addWidget(graph_widget)行的注釋時,會出現 TypeError 消息。 消息指出

TypeError: addWidget(self, QWidget, stretch: int = 0, alignment: Union[Qt.Alignment, 
Qt.AlignmentFlag] = Qt.Alignment()): argument 1 has unexpected type 
'GraphicsLayoutWidget'

不能將GraphicsLayoutWidget放在QHBoxLayout()上嗎? 如果是這樣,什么是正確的組織方式,這樣我就可以在圖表旁邊放置滑塊、行編輯等。

一個問題是您將graph_widget設置為QMainWindow實例的中央小部件,然后將其添加到布局中以添加更多小部件。

如果將通用QWidget設置為窗口的中央小部件,設置布局,然后將graph_widget和任何其他小部件添加到布局,我認為您更有可能獲得所需的結果。

這是一個示例,使用您的代碼和評論中@musicmante 的解決方案,並添加垂直 slider:

from PyQt5.QtWidgets import QHBoxLayout, QWidget, QSlider #  Import PyQt5 first before pyqtgraph
from pyqtgraph.Qt import QtWidgets, mkQApp
import pyqtgraph as pg
import numpy as np

from pyqtgraph.Qt import QtGui, QtCore

pg.setConfigOption('background', 'lightgray')
pg.setConfigOption('foreground','black')

font = QtGui.QFont("Times", 18)

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.central = QWidget()                          # create a QWidget
        slider = QSlider(orientation=QtCore.Qt.Vertical)  # Vertical Slider

        graph_widget = pg.GraphicsLayoutWidget(show=True)
        self.setWindowTitle('pyqtgraph example: heatmap display')
        self.setStyleSheet("background-color: lightgray;")
        self.resize(1000,1000)

        self.setCentralWidget(self.central)  # set the QWidget as centralWidget
        layout = QHBoxLayout(self.central)  # assign layout to central widget

        layout.addWidget(graph_widget) # No More error
        layout.addWidget(slider)       # add a slider

        self.show()

        corrMatrix = np.array([
            [ 1.        ,  0.5184571 , -0.70188642],
            [ 0.5184571 ,  1.        , -0.86094096],
            [-0.70188642, -0.86094096,  1.        ]
        ])
        columns = ["A", "B", "C"]

        pg.setConfigOption('imageAxisOrder', 'row-major')

        correlogram = pg.ImageItem()

        tr = QtGui.QTransform().translate(-0.5, -0.5)
        correlogram.setTransform(tr)
        correlogram.setImage(corrMatrix)

        plotItem = graph_widget.addPlot()

        plotItem.invertY(True)
        plotItem.setDefaultPadding(0.0)
        plotItem.addItem(correlogram)

        plotItem.showAxes( True, showValues=(True, True, False, False), size=40 )

        ticks = [ (idx, label) for idx, label in enumerate( columns ) ]
        for side in ('left','top','right','bottom'):
            plotItem.getAxis(side).setTicks( (ticks, []) )
            plotItem.getAxis(side).setTickFont(font)
        plotItem.getAxis('bottom').setHeight(10)

        colorMap = pg.colormap.get("CET-D1")
        bar = pg.ColorBarItem( interactive=False,values=(0,1), colorMap=colorMap)
        bar.setImageItem(correlogram, insert_in=plotItem)


mkQApp("Correlation matrix display")
main_window = MainWindow()

if __name__ == '__main__':
    pg.exec()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM