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')