Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x QTreeWidget和QPainter组合_Python 3.x_Pyqt5_Qpainter_Qtreewidget - Fatal编程技术网

Python 3.x QTreeWidget和QPainter组合

Python 3.x QTreeWidget和QPainter组合,python-3.x,pyqt5,qpainter,qtreewidget,Python 3.x,Pyqt5,Qpainter,Qtreewidget,我对QTreeWidget有点迷茫,我无法从找到的主题(如:或)中获取相关信息 我有两个文件,一个是gui,一个是工作类: gui: class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") self.tree = QtWidgets.QTreeWidget(Dialog) self.tree.setGeometry(QtCore.

我对QTreeWidget有点迷茫,我无法从找到的主题(如:或)中获取相关信息

我有两个文件,一个是gui,一个是工作类:

gui:

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")

        self.tree = QtWidgets.QTreeWidget(Dialog)
        self.tree.setGeometry(QtCore.QRect(10, 60, 760, 480))
        self.tree.setHeaderLabels(['circ', 'state', 'test'])
        self.tree.setSortingEnabled(True)
class AppWindow(QDialog):   
    def __init__(self, fullscreen=False):          
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.show()  


        self.timer = QTimer()
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.refresh_gui) 
        self.timer.start()


    def refresh_gui(self):
        self.painter = QPainter(self)
        tmp = {0: {"state": 1, "info": "hello"}, 1: {"state": 0, "info": "world"}}          
        for i in tmp:
            if tmp[i]["state"] == 0:
                painter.setPen(QPen(Qt.red,  8, Qt.SolidLine))
            else:
                painter.setPen(QPen(Qt.green,  8, Qt.SolidLine))
            circ = painter.drawEllipse(2,2,20,20)

            item = QtWidgets.QTreeWidgetItem(self.ui.tree, [circ, tmp[i]["state"], "empty"])
            item.setText(2, "circ painted")
工人:

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")

        self.tree = QtWidgets.QTreeWidget(Dialog)
        self.tree.setGeometry(QtCore.QRect(10, 60, 760, 480))
        self.tree.setHeaderLabels(['circ', 'state', 'test'])
        self.tree.setSortingEnabled(True)
class AppWindow(QDialog):   
    def __init__(self, fullscreen=False):          
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.show()  


        self.timer = QTimer()
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.refresh_gui) 
        self.timer.start()


    def refresh_gui(self):
        self.painter = QPainter(self)
        tmp = {0: {"state": 1, "info": "hello"}, 1: {"state": 0, "info": "world"}}          
        for i in tmp:
            if tmp[i]["state"] == 0:
                painter.setPen(QPen(Qt.red,  8, Qt.SolidLine))
            else:
                painter.setPen(QPen(Qt.green,  8, Qt.SolidLine))
            circ = painter.drawEllipse(2,2,20,20)

            item = QtWidgets.QTreeWidgetItem(self.ui.tree, [circ, tmp[i]["state"], "empty"])
            item.setText(2, "circ painted")
我想知道,如果
state==0
第一列显示一个红色圆圈,如果
state==1
显示一个绿色圆圈。我不知道如何将PyQt5.QtGui.qPaint对象而不是字符串传递给QTreeWidgetItem

此外,我确实得到了错误:

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted
并且一些行更低(因为它):
QPainter::setPen:Painter未激活

因为我调用了
self.painter=QPainter(self)
,这是讨论过的,但我无法在代码中修复它。我在QPixmap上找到了这个,它对我也很有用,但不是我在这里要找的

小部件的绘制不是在任何方法中完成的,但是必须重写paintEvent方法,只要Qt需要或开发人员使用update或repaint,就会调用该方法。但是对于处理从QAbstractItemView继承的模型(即大量有组织的信息)的类,如果要绘制项目,则必须使用委托

考虑到上述情况,解决方案是:

类委托(QtWidgets.QStyledItemDelegate):
def油漆(自身、油漆工、选项、索引):
state=index.data(QtCore.Qt.UserRole)
颜色=(
QtGui.QColor(QtCore.Qt.red)如果state==0,则为其他QtGui.QColor(QtCore.Qt.green)
)
painter.setPen(QtGui.QPen(color,4,QtCore.Qt.SolidLine))
直径=最小值(option.rect.width(),option.rect.height())
rect=QtCore.QRect(0,0,直径//2,直径//2)
rect.moveCenter(option.rect.center())
画家。抽屉(矩形)
类AppWindow(QtWidgets.QDialog):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.ui=ui_Dialog()
self.ui.setupUi(self)
self.show()
delegate=delegate(self.ui.tree)
self.ui.tree.setItemDelegateForColumn(0,委托)
self.timer=QtCore.QTimer(间隔=500,超时=self.refresh\u gui)
self.timer.start()
@QtCore.pyqtSlot()
def refresh_gui(自):
tmp=[{“状态”:1,“信息”:“你好”},{“状态”:0,“信息”:“世界”}]
对于tmp中的d:
item=QtWidgets.QTreeWidgetItem(self.ui.tree,[“”,str(d[“state”],“empty”]))
item.setData(0,QtCore.Qt.UserRole,d[“state”])
第二项(2,“中国保监会涂漆”)

小部件的绘制不是用任何方法完成的,但是必须重写paintEvent方法,只要Qt需要,或者开发人员使用update或repaint,就会调用该方法。但是对于处理从QAbstractItemView继承的模型(即大量有组织的信息)的类,如果要绘制项目,则必须使用委托

考虑到上述情况,解决方案是:

类委托(QtWidgets.QStyledItemDelegate):
def油漆(自身、油漆工、选项、索引):
state=index.data(QtCore.Qt.UserRole)
颜色=(
QtGui.QColor(QtCore.Qt.red)如果state==0,则为其他QtGui.QColor(QtCore.Qt.green)
)
painter.setPen(QtGui.QPen(color,4,QtCore.Qt.SolidLine))
直径=最小值(option.rect.width(),option.rect.height())
rect=QtCore.QRect(0,0,直径//2,直径//2)
rect.moveCenter(option.rect.center())
画家。抽屉(矩形)
类AppWindow(QtWidgets.QDialog):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.ui=ui_Dialog()
self.ui.setupUi(self)
self.show()
delegate=delegate(self.ui.tree)
self.ui.tree.setItemDelegateForColumn(0,委托)
self.timer=QtCore.QTimer(间隔=500,超时=self.refresh\u gui)
self.timer.start()
@QtCore.pyqtSlot()
def refresh_gui(自):
tmp=[{“状态”:1,“信息”:“你好”},{“状态”:0,“信息”:“世界”}]
对于tmp中的d:
item=QtWidgets.QTreeWidgetItem(self.ui.tree,[“”,str(d[“state”],“empty”]))
item.setData(0,QtCore.Qt.UserRole,d[“state”])
第二项(2,“中国保监会涂漆”)

您得到的绘制错误与matplotlib问题无关:您不能随时调用小部件上的QPaint,因为它只能在Qt创建的
paintEvent
内完成(由系统请求“显示”小部件触发,或者在调用
update()
repaint()
后触发)。如果您想在项目视图中显示其他内容,则必须对a进行子类化并覆盖其方法。您得到的绘制错误与matplotlib问题无关:您不能随时调用小部件上的QPaint,因为它只能在Qt创建的
paintEvent
内完成(由系统请求“显示”触发)小部件,或者在调用
update()
repaint()
)之后。如果要在项目视图中显示其他内容,则必须将a子类化并覆盖其方法.Works。非常感谢。我现在有两个问题:(1)未调用paint,但由于委托的类型为QStyledItemDeleteGate,因此会重新调用它,对吗?(2) 为什么我需要装修工?工作。非常感谢。我现在有两个问题:(1)未调用paint,但由于委托的类型为QStyledItemDeleteGate,因此会重新调用它,对吗?(2) 我为什么需要装修工?