Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修改QT designer生成的现有PlotWidget的viewbox?_Python_Pyqt_Pyqt5_Qt Designer_Pyqtgraph - Fatal编程技术网

Python 如何修改QT designer生成的现有PlotWidget的viewbox?

Python 如何修改QT designer生成的现有PlotWidget的viewbox?,python,pyqt,pyqt5,qt-designer,pyqtgraph,Python,Pyqt,Pyqt5,Qt Designer,Pyqtgraph,我需要从绘图中选择并获取两个图形的数据,我找到了一个示例,其中创建了一个自定义viewbox,然后创建了一个类似于pw=pg.PlotWidget(viewbox=vb)的绘图,但我不知道如何在我们将绘图作为Qt Creator提升的pyqtgraph小部件时执行此操作,下面是我在论坛中找到的示例(链接:) 下面是代码(工作完美) 如何使前面的代码适应PlotWidget“Plot1” 这是文件 有人能帮我吗?解决方案是创建一个从PlotWidget继承的类,并将viewbox升级到MyView

我需要从绘图中选择并获取两个图形的数据,我找到了一个示例,其中创建了一个自定义viewbox,然后创建了一个类似于pw=pg.PlotWidget(viewbox=vb)的绘图,但我不知道如何在我们将绘图作为Qt Creator提升的pyqtgraph小部件时执行此操作,下面是我在论坛中找到的示例(链接:) 下面是代码(工作完美)

如何使前面的代码适应PlotWidget“Plot1”

这是文件


有人能帮我吗?

解决方案是创建一个从PlotWidget继承的类,并将viewbox升级到MyViewBox,然后升级该小部件:

plotwidget.py

将numpy导入为np
将pyqtgraph作为pg导入
从pyqtgraph.Qt导入QtGui,QtCore
尝试:
从matplotlib.mlab导入内部
除恐怖外:
# https://matplotlib.org/3.1.0/api/api_changes.html
#在matplotlib 3.1.0中删除了mlab.inside_poly
从matplotlib.path导入路径
def内部多边形(点、顶点):
多边形=路径(顶点)
返回[idx代表idx,如果多边形包含_点(p),则枚举(点)中的p]
类ChildGroup(pg.ItemGroup):
sigItemsChanged=QtCore.Signal()
定义初始化(自身,父级):
超级(子组,自我)。\uuuuu初始\uuuuuuu(父)
#转换更改时不告诉视图
self.\u GraphicsObject\u通知\u查看\u更改=False
def itemChange(自身、更改、值):
ret=ItemGroup.itemChange(self、change、value)
如果change==self.ItemChildAddedChange或change==self.ItemChildRemovedChange:
self.sigItemsChanged.emit()
回程网
类MyViewBox(pg.ViewBox):
def MousedRageEvent(自身,电动汽车):
如果ev.button()==QtCore.Qt.RightButton:
ev.ignore()
其他:
pg.ViewBox.mouseDragEvent(自我,电动)
ev.accept()
pos=ev.pos()
如果ev.button()==QtCore.Qt.RightButton:
如果ev.isFinish():
self.rbScaleBox.hide()
self.ax=QtCore.QRectF(
pg.Point(ev.button向下位置(ev.button())、pg.Point(位置)
)
self.ax=self.childGroup.mapRectFromParent(self.ax)
self.Coords=self.ax.getCoords()
self.getdataInRect()
self.changePointsColors()
其他:
self.updateScaleBox(ev.buttonDownPos(),ev.pos())
def getdataInRect(自身):
#从Graphicsitem获取数据
self.getDataItem()
x=self.dataxy[0]
y=self.dataxy[1]
#直边
Xbl=(self.Coords[0],self.Coords[1])#左下角
Xbr=(self.Coords[2],self.Coords[1])#右下角
Xtr=(self.Coords[2],self.Coords[3])#右上角
Xtl=(self.Coords[0],self.Coords[3])#左上角
#列出[(x0,y0),(x1,y1)…]
self.xy=list()
对于x中的i:
tmp=(x[i],y[i])
self.xy.append(tmp)
self.insideIndex=内部多边形(self.xy,[Xbl,Xbr,Xtr,Xtl])
def getDataItem(自身):
self.ObjItemList=pg.graphicscene.items(self.scene(),self.ax)
self.dataxy=self.ObjItemList[0]。listDataItems()[0]。getData()
def变更点颜色(自身):
打印(self.xy)
打印(自我内部索引)
类MyPlotWidget(pg.PlotWidget):
def uuu init uuu(self,parent=None):
super(MyPlotWidget,self)。\uuuuu init\uuuuuuu(父级,viewBox=MyViewBox())
Sample.ui


对话
0
0
487
368
255
255
255
86
86
86
255
255
255
86
86
86
86
86
86
86
86
86
对话
30
40
40
30
假的
0
0
0
MyPlotWidget
QGraphicsView
plotwidget
main.py

从PyQt5导入QtWidgets
将pyqtgraph作为pg导入
从示例导入Ui_对话框
类MyApp(QtWidgets.QDialog,Ui_对话框):
def uuu init uuu(self,parent=None):
超级(MyApp,self)。\uuuuu初始化\uuuuuuu(父级)
pg.setConfigOption(“背景”、“w”)
self.setupUi(self)
self.Plot1.plotItem.showGrid(真、真、0.7)
self.Plot1.setLabel(“左”、“q1”)
self.Plot1.setLabel(“底部”、“时间”、单位=“s”)
self.Plot1.setTitle(title=“q1”)
pen=pg.mkPen({“颜色”:“FF0000”,“宽度”:2})
pen1=pg.mkPen({“颜色”:“00FF00”,“宽度”:2})
self.Plot1.addLegend()
self.q1z=self.Plot1.plot(pen=pen,name=“Trace 1”)
self.q1k=self.Plot1.plot(pen=pen1,name=“Trace 2”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=MyApp()
w、 show()
sys.exit(app.exec_())

很抱歉,我没有回答之前的问题,因为我的电脑的w10已经更新,不再工作了((,现在我刚刚安装了w10。谢谢你的朋友,它工作得很好。我注意到当我绘制矩形来选择数据时,如果矩形位于X轴下,那么self.ObjItemList=pg.graphicscene.items(self.scene(),self.ax)返回空,因此如果我想选择位于x轴下方的数据,我必须确保矩形至少有一个顶点位于x轴上方。有什么建议吗?
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Point import Point
from pyqtgraph.graphicsItems.ItemGroup import ItemGroup
from pyqtgraph.Qt import QtGui, QtCore
from matplotlib.mlab import inside_poly
from pyqtgraph.graphicsItems import ScatterPlotItem


class ChildGroup(ItemGroup):
    sigItemsChanged = QtCore.Signal()
    def __init__(self, parent):
        ItemGroup.__init__(self, parent)
        # excempt from telling view when transform changes
        self._GraphicsObject__inform_view_on_change = False
    def itemChange(self, change, value):
        ret = ItemGroup.itemChange(self, change, value)
        if change == self.ItemChildAddedChange or change == self.ItemChildRemovedChange:
            self.sigItemsChanged.emit()   
        return ret

class MyViewBox(pg.ViewBox):

    def mouseDragEvent(self, ev):

        if ev.button() == QtCore.Qt.RightButton:
            ev.ignore()    
        else:
            pg.ViewBox.mouseDragEvent(self, ev)

        ev.accept() 
        pos = ev.pos()
        if ev.button() == QtCore.Qt.RightButton:

            if ev.isFinish():  
                self.rbScaleBox.hide()
                self.ax = QtCore.QRectF(Point(ev.buttonDownPos(ev.button())), Point(pos))
                self.ax = self.childGroup.mapRectFromParent(self.ax) 
                self.Coords =  self.ax.getCoords()  
                self.getdataInRect()
                self.changePointsColors()
            else:
                self.updateScaleBox(ev.buttonDownPos(), ev.pos())

    def getdataInRect(self):
        # Get the data from the Graphicsitem
        self.getDataItem()
        x = self.dataxy[0]
        y = self.dataxy[1]
        # Rect Edges
        Xbl = (self.Coords[0],self.Coords[1]) # bottom left
        Xbr = (self.Coords[2],self.Coords[1]) # bottom right
        Xtr = (self.Coords[2],self.Coords[3]) # top right
        Xtl = (self.Coords[0],self.Coords[3]) # top left
        #Make a list of [(x0,y0),(x1,y1) ...]
        self.xy = list()
        for i in x:
                tmp = (x[i],y[i])
                self.xy.append(tmp)            
        self.insideIndex = inside_poly(self.xy,[Xbl, Xbr, Xtr, Xtl])    

    def getDataItem(self):

        self.ObjItemList = pg.GraphicsScene.items(self.scene(),self.ax)
        self.dataxy = self.ObjItemList[0].listDataItems()[0].getData()

    def changePointsColors(self):

        print(self.xy)
        print(self.insideIndex)

app = QtGui.QApplication([])
mw = QtGui.QMainWindow()
mw.resize(800,500)
mw.show()

vb = MyViewBox()
pw = pg.PlotWidget(viewBox=vb) 

a  = np.array([0,1,2,3,4,5,6,7,8,9,10])
b  = np.array([0,1,2,3,4,5,6,7,8,9,10])

curve0 = pw.plot(a,b, clickable=True, symbol = '+')

mw.setCentralWidget(pw)

# Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
    pg.setConfigOption('background', 'w')
    QtWidgets.QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)
    self.setupUi(self)

    self.Plot1.plotItem.showGrid(True, True, 0.7)

    self.Plot1.setLabel('left', 'q1')
    self.Plot1.setLabel('bottom', 'Time', units='s')
    self.Plot1.setTitle(title='q1')

    pen = pg.mkPen({'color': "FF0000", 'width': 2})
    pen1 = pg.mkPen({'color': "00FF00", 'width': 2})
    self.Plot1.addLegend()
    self.q1z = self.Plot1.plot(pen = pen, name = 'Trace 1')
    self.q1k = self.Plot1.plot(pen = pen1, name = 'Trace 2')
pyuic5 Sample.ui -o sample.py -x
├── main.py
├── plotwidget.py
├── sample.py
└── Sample.ui