Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 如何检查复选框是否已选中?(在QTreeWidget中)_Python_Pyqt_Pyqt4_Python 3.3_Qtreewidget - Fatal编程技术网

Python 如何检查复选框是否已选中?(在QTreeWidget中)

Python 如何检查复选框是否已选中?(在QTreeWidget中),python,pyqt,pyqt4,python-3.3,qtreewidget,Python,Pyqt,Pyqt4,Python 3.3,Qtreewidget,我已经编写了以下代码: from PyQt4 import QtCore, QtGui import sys class window(QtGui.QMainWindow): def __init__(self, parent=None): super(window, self).__init__(parent) self.TreeWidget = QtGui.QTreeWidget() self.TreeWidget.setColumn

我已经编写了以下代码:

from PyQt4 import QtCore, QtGui
import sys

class window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__(parent)
        self.TreeWidget = QtGui.QTreeWidget()
        self.TreeWidget.setColumnCount(1)
        item1 = QtGui.QTreeWidgetItem(["Item 1"])
        item1.setCheckState(0, QtCore.Qt.Checked)
        item2 = QtGui.QTreeWidgetItem(["Item 2"])
        item2.setCheckState(0, QtCore.Qt.Unchecked)
        item3 = QtGui.QTreeWidgetItem(["Item 3"])
        item3.setCheckState(0, QtCore.Qt.Unchecked)
        self.TreeWidget.addTopLevelItem(item1)
        self.TreeWidget.addTopLevelItem(item2)
        self.TreeWidget.addTopLevelItem(item3)
        self.setCentralWidget(self.TreeWidget)

        if item1.checkState(0) == QtCore.Qt.Checked:
            print('item 1 is checked')
        if item2.checkState(0) == QtCore.Qt.Checked:
            print('item 2 is checked')
        if item3.checkState(0) == QtCore.Qt.Checked:
            print('item 3 is checked')

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    ui = window()
    ui.show()
    sys.exit(app.exec_())
通过上面的代码,我成功地创建了复选框。但是,当我运行程序时,我希望打印用户检查时检查的项目。据我所知,我需要使用
事件
信号
,但我不确定如何设置
信号
。我发现一个示例代码显示了
MousePressEvent
的使用,但我不确定如何使用
python
实现该代码

示例如下:

#include <QtGui>

class TreeWidget : public QTreeWidget
{
public:
        TreeWidget()
        {
                setColumnCount(1);
                item1 = new QTreeWidgetItem(this);
                item1->setExpanded(true);
                item1->setFlags(item1->flags() | Qt::ItemIsUserCheckable);
                item1->setCheckState(0, Qt::Checked);
                item1->setText(0, "item 1");

                item2 = new QTreeWidgetItem(item1);
                item2->setFlags(item2->flags() | Qt::ItemIsUserCheckable);
                item2->setCheckState(0, Qt::Checked);
                item2->setText(0, "item 2");

                item3 = new QTreeWidgetItem(this);
                item3->setText(0, "item 3");
                item3->setFlags(item3->flags() | Qt::ItemIsUserCheckable);
                item3->setCheckState(0, Qt::Checked);

        }
        void mousePressEvent(QMouseEvent *event)
        {
                QModelIndex indexClicked = indexAt(event->pos());
                if(indexClicked.isValid()) {
                        QRect vrect = visualRect(indexClicked);
                        int itemIndentation = vrect.x() - visualRect(rootIndex()).x();
                        QRect rect = QRect(header()->sectionViewportPosition(0) + itemIndentation
                                , vrect.y(), style()->pixelMetric(QStyle::PM_IndicatorWidth), vrect.height());
                        if(rect.contains(event->pos())) {
                                qDebug() << "checkbox clicked";
                                QTreeWidget::mousePressEvent(event);
                                return;
                        } else {
                                QTreeWidget::mousePressEvent(event);
                        }}}
private:
        QTreeWidgetItem *item1;
        QTreeWidgetItem *item2;
        QTreeWidgetItem *item3;
        QTreeWidgetItem *item4;
};

int main(int argc, char **argv)
{
        QApplication app(argc, argv);
        TreeWidget box;
        box.show();
        return app.exec();
}
#包括
类TreeWidget:公共QTreeWidget
{
公众:
树丛
{
setColumnCount(1);
item1=新的QTreeWidgetItem(本);
item1->setExpanded(true);
item1->setFlags(item1->flags()| Qt::ItemIsUserCheckable);
item1->setCheckState(0,Qt::Checked);
item1->setText(0,“item1”);
item2=新的QTreeWidgetItem(item1);
item2->setFlags(item2->flags()| Qt::ItemIsUserCheckable);
item2->setCheckState(0,Qt::Checked);
item2->setText(0,“item2”);
item3=新的QTreeWidgetItem(本);
item3->setText(0,“item3”);
item3->setFlags(item3->flags()| Qt::ItemIsUserCheckable);
item3->setCheckState(0,Qt::Checked);
}
作废鼠标压力事件(QMouseEvent*事件)
{
QModelIndex indexClicked=indexAt(事件->位置());
if(indexClicked.isValid()){
QRect vrect=视觉直视(indexClicked);
int itemdentation=vrect.x()-visualRect(rootIndex()).x();
QRect rect=QRect(header()->sectionViewportPosition(0)+项缩进
,vrect.y(),style()->pixelMetric(QStyle::PM_IndicatorWidth),vrect.height();
if(rect.contains(事件->位置()){
qDebug()使用信号:


复选框是字段中的一种值。它与文本不同,但仍然是值。 复选框可以通过鼠标事件或键盘事件(空格键)触发。因此,识别此类事件的最简单方法是将
QTreeWidgetItem
子类化,并将最后一个复选框状态存储为
QtCore.Qt.CheckState
类型的变量

请考虑下面的代码:

from\uuuuu future\uuuuu导入注释
从PyQt5.QtWidgets导入*
从PyQt5.QtCore导入*
从PyQt5.QtGui导入*
导入系统,键入
类MyTree(QTreeWidget):
类别MyItem(QTreeWidgetItem):
定义初始化(自身,父级):
super()。\uuuu init\uuuu(父级)
#假设一个元素只有一个复选框
# 
self.storedCheckedState:QtCore.Qt.CheckState=self.CheckState(0)
#否则,我们需要更多的存储变量
def setCheckState(self,column:int,state:QtCore.Qt.CheckState)->None:
#第一列中的复选框:
如果列==0:
self.storedCheckedState=状态
return super().setCheckState(列,状态)
def uuu init uuu(self,parent:typing.Optional[QWidget]=None)->None:
super()。\uuuuu init\uuuuuu(父=父)
self.setColumnCount(4)
header=MyTree.headerItem(self)
header.setText(1,'A')
header.setText(2,'B')
header.setText(3,'C')
header.setText(4,'D')
def已更改(self,item:MyTree.MyItem,column:int)->无:
如果列==0:
如果item.StoredCheckdState!=item.checkState(0):
打印(“项目已选中!”)
item.StoredCheckdState=item.checkState(0)
其他:
打印(“项目已编辑,但未选中!”)
其他:
打印(“某些字段已编辑…”)
def loadData(自身,数据:键入.Any)->无:
#停止事件传播
尝试:
self.disconnect()
除:
通过
#在那里加载数据。。。
#在这种特殊情况下,
#该树将简单地生成:
# 
#[]母公司1
#[]儿童1
#[]儿童2
#[]儿童3
# ...
对于范围(3)中的i:
#父项=QTreeWidgetItem(树)
parent=MyTree.MyItem(self)
parent.setText(0,“parent{}”.format(i))
parent.setFlags(parent.flags()| Qt.ItemIsTristate | Qt.ItemIsUserCheckable | Qt.TextEditable | Qt.ItemIsEditable)
对于范围(5)内的x:
child=MyTree.MyItem(父项)
setFlags(child.flags()| Qt.ItemIsUserCheckable | Qt.TextEditable | Qt.ItemIsEditable)
setText(0,“child{}”.format(x))
setCheckState(0,Qt.Unchecked)
#恢复事件传播
self.itemChanged.connect(self.changed)
def main():
app=QApplication(sys.argv)
tree=MyTree()
tree.loadData(“任何数据”)
tree.show()
sys.exit(app.exec_())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

键盘的空格键可以触发复选框。代码将错过此事件。
class window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__(parent)
        self.TreeWidget = QtGui.QTreeWidget()
        self.TreeWidget.setColumnCount(1)
        # self.item1/2/3 = ....  save reference to the items
        #   to access them in the callback (check_status)
        item1 = self.item1 = QtGui.QTreeWidgetItem(["Item 1"])
        item1.setCheckState(0, QtCore.Qt.Checked)
        item2 = self.item2 = QtGui.QTreeWidgetItem(["Item 2"])
        item2.setCheckState(0, QtCore.Qt.Unchecked)
        item3 = self.item3 = QtGui.QTreeWidgetItem(["Item 3"])
        item3.setCheckState(0, QtCore.Qt.Unchecked)
        self.TreeWidget.addTopLevelItem(item1)
        self.TreeWidget.addTopLevelItem(item2)
        self.TreeWidget.addTopLevelItem(item3)
        self.setCentralWidget(self.TreeWidget)

        # connect the itemClicked signal to the callback check_status.
        self.TreeWidget.itemClicked.connect(self.check_status)

    def check_status(self):
        if self.item1.checkState(0) == QtCore.Qt.Checked:
            print('item 1 is checked')
        if self.item2.checkState(0) == QtCore.Qt.Checked:
            print('item 2 is checked')
        if self.item3.checkState(0) == QtCore.Qt.Checked:
            print('item 3 is checked')