python - QTreeWidget PyQt 中出现额外的行
问题描述
我有一段代码,其中我向QTreeWidget
父项添加了两个子项。子项目设置为“可编辑”。
我在这里面临两个问题:
- 出现一个额外的行,其中包含空的可编辑项目。(我希望“Min”和“Max”在同一行)
- 如果我将可编辑项目更改为空字符串,那么它看起来好像什么都没有,我想要某种荧光笔,这里有一个空字段(某种框)
我怎样才能绕过这些问题?
代码:
import sys
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.FilterList = QTreeWidget()
self.setCentralWidget(self.FilterList)
self.setWindowTitle("Form")
self.setGeometry(50,50,800,500)
self.generateData()
def generateData(self):
self.FilterList.setColumnCount(3)
self.FilterList.setHeaderLabels(["Filter Questions"])
DifficultyNode = QTreeWidgetItem(["Difficulty"])
self.FilterList.addTopLevelItem(DifficultyNode)
self.FilterList.itemChanged.connect(self.handleItemChanged)
EasyNode = QTreeWidgetItem(["Easy"])
EasyNode.setCheckState(0, Qt.Unchecked)
NormalNode = QTreeWidgetItem(["Normal"])
NormalNode.setCheckState(0, Qt.Unchecked)
HardNode = QTreeWidgetItem(["Hard"])
HardNode.setCheckState(0, Qt.Unchecked)
HardNode.setFlags(HardNode.flags() | QtCore.Qt.ItemIsEditable)
MinNode = QTreeWidgetItem()
MinNode.setText(1, "Min")
MinNode.setFlags(MinNode.flags() | QtCore.Qt.ItemIsEditable)
MaxNode = QTreeWidgetItem()
MaxNode.setText(2, "Max")
MaxNode.setFlags(MaxNode.flags() | QtCore.Qt.ItemIsEditable)
DifficultyNode.addChild(EasyNode)
EasyNode.addChild(MinNode)
EasyNode.addChild(MaxNode)
DifficultyNode.addChild(NormalNode)
DifficultyNode.addChild(HardNode)
def handleItemChanged(self, item, column):
if item.checkState(column) == QtCore.Qt.Checked:
print('Item Checked', item.text(column))
elif item.checkState(column) == QtCore.Qt.Unchecked:
print('Item Unchecked', item.text(column))
def main():
app = QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
main()
解决方案
要在同一行上获取“Min”和“Max”,请仅使用一个 QTreeWidgetItem 并为两列设置文本。
如果你想要一个永久框,一个选项是将itemWidget
QTreeWidgetItem 设置为 QLineEdit 并连接它editingFinished
以设置项目文本。
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.FilterList = QTreeWidget()
self.setCentralWidget(self.FilterList)
self.setWindowTitle("Form")
self.setGeometry(50,50,800,500)
self.generateData()
def generateData(self):
self.FilterList.setColumnCount(3)
self.FilterList.setHeaderLabels(["Filter Questions"])
DifficultyNode = QTreeWidgetItem(["Difficulty"])
self.FilterList.addTopLevelItem(DifficultyNode)
self.FilterList.itemChanged.connect(self.handleItemChanged)
EasyNode = QTreeWidgetItem(["Easy"])
EasyNode.setCheckState(0, Qt.Unchecked)
NormalNode = QTreeWidgetItem(["Normal"])
NormalNode.setCheckState(0, Qt.Unchecked)
HardNode = QTreeWidgetItem(["Hard"])
HardNode.setCheckState(0, Qt.Unchecked)
HardNode.setFlags(HardNode.flags() | QtCore.Qt.ItemIsEditable)
MinNode = QTreeWidgetItem()
DifficultyNode.addChild(EasyNode)
EasyNode.addChild(MinNode)
DifficultyNode.addChild(NormalNode)
DifficultyNode.addChild(HardNode)
self.setTextBox(MinNode, 1, "Min")
self.setTextBox(MinNode, 2, "Max")
def setTextBox(self, item, column, text):
box = QLineEdit(text)
box.editingFinished.connect(lambda: item.setText(column, box.text()))
self.FilterList.setItemWidget(item, column, box)
def handleItemChanged(self, item, column):
if item.checkState(column) == QtCore.Qt.Checked:
print('Item Checked', item.text(column))
elif item.checkState(column) == QtCore.Qt.Unchecked:
print('Item Unchecked', item.text(column))
推荐阅读
- json - QFileDialog::getSaveFileName() 在文件对话框中点击保存后返回一个空字符串
- php - 显示项目后如何将项目添加到数据库表中?
- r - 如何在ggplot中的地图上绘制等宽的矩形
- ajax - 从一个控制器 LARAVEL 使用 AJAX 调用不同的函数
- ssl - 如何使用 openssl 验证 DER 证书?
- python - 有没有办法调整keras模型的输出?
- php - 将电话号码中的 '0' 替换为 1 Laravel
- c# - C# Visual Studio:在程序集中嵌入 XML 文档文件
- django - 在 DRF ModelViewSet 上创建用户的自定义错误消息
- firebase - Firebase Firestore 在 react useEffect() 挂钩内运行两次。为什么?