[英]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.