如何将 QTreeWidget 的子项设置为在单击其父项时自动选择并突出显示

Posted

技术标签:

【中文标题】如何将 QTreeWidget 的子项设置为在单击其父项时自动选择并突出显示【英文标题】:How to set a child item of a QTreeWidget tobe auto selected and highlighted when click on its parent 【发布时间】:2020-06-02 11:05:51 【问题描述】:

这是我的代码,它会工作一段时间,但大多数时候都不会。我已经搜索过这个,但解决方案不起作用。

(我用的是pyside2,不是pyqt5)

点击父级

自动选择子项

import sys
import time

from PySide2.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,\
QLabel,QMainWindow,QLineEdit,QScrollArea,QVBoxLayout,QMessageBox,QComboBox,QMenu,QAction,\
QDialog,QTreeWidget,QTreeWidgetItem,QSlider,QAbstractItemView,QHBoxLayout
from PySide2.QtCore import QTimer,QDateTime,QSize,Qt,Signal,Slot,QThread,QMutex,QMutexLocker,QItemSelectionModel
from PySide2.QtGui import *


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(320, 300)
        self.setWindowTitle("--")
        self.setStyleSheet(
            """
            QMainWindow
            
                background-color:white;
                color:white;
                margin:0px
            
            """
        )
        self.InitializeWindow()

    def InitializeWindow(self):
        self.center = QWidget(self)
        self.center.setGeometry(0, 0, 320, 300); 
        layout=QHBoxLayout()

        self.tree=QTreeWidget()
        self.tree.setColumnCount(1)
        self.tree.setHeaderLabels(['func'])

        root1=QTreeWidgetItem(self.tree)
        root1.setText(0,'-A')

        self.tree.setColumnWidth(0,100)
        self.child1_1=QTreeWidgetItem(root1)
        self.child1_1.setText(0,'--aa')

        self.child1_2=QTreeWidgetItem(root1)
        self.child1_2.setText(0,'--bb')

        root2=QTreeWidgetItem(self.tree)
        root2.setText(0,'-B')

        self.child2_1=QTreeWidgetItem(root2)
        self.child2_1.setText(0,'--cc')

        self.child2_2=QTreeWidgetItem(root2)
        self.child2_2.setText(0,'--dd')

        self.child2_3=QTreeWidgetItem(root2)
        self.child2_3.setText(0,'--ee')

        self.tree.addTopLevelItem(root1)
        self.tree.addTopLevelItem(root2)

        self.area_op=QWidget()
        self.area_op.setMinimumWidth(100)
        self.area_op.setStyleSheet(
            '''QWidget
            
                background-color:white;
                color:white;
                font-size:15px;
                border:0px solid #708090;
                margin:0px
            '''
            )

        self.tree.currentItemChanged.connect(self.tree_onClick)

        layout.addWidget(self.tree)
        layout.addWidget(self.area_op)
        self.center.setLayout(layout)
        self.show()

    def tree_onClick(self):
        getSelected = self.tree.currentItem()
        #print(str(sys._getframe().f_lineno),getSelected)
        if getSelected:
            if(getSelected.text(0)=='--cc'):
                pass
            elif(getSelected.text(0)=="-A"):
                getSelected.setExpanded(True)
                self.tree.setCurrentItem(self.child1_1)
            elif(getSelected.text(0)=="-B"):
                getSelected.setExpanded(True)
                self.tree.setCurrentItem(self.child2_1,0,QItemSelectionModel.Select)
                if self.child2_1.isSelected()==False:
                    self.child2_1.setSelected(True)
            else:
                pass
        else:
            print(str(sys._getframe().f_lineno),"tree error ",getSelected)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

【问题讨论】:

如果系统告诉您您的帖子主要是代码并要求您添加更多上下文,请不要在其中添加随机噪音。而是澄清您的问题并添加上下文。请edit 它并解释您所说的“有时有效”是什么意思。在什么条件下?当/你所说的“不起作用”是什么意思时会发生什么?有什么错误吗?另请参阅How to Ask。 【参考方案1】:

如果您想自动选择第一个子项,则不应检查项目文本,而是检查它是否确实有子项。

另外,使用currentItemChanged 可能不是一个好主意,因为如果您尝试更改当前项目作为其结果,该信号可能会产生一些不一致(这可能是您问题的根源,即使我不是'无法重现它)。

解决方案是改用itemClicked() 信号,并利用它的第一个参数(点击的项目)。

        # ...
        self.tree.itemClicked.connect(self.tree_onClick)
        # ...

    def tree_onClick(self, item, column):
        if item.childCount():
            self.tree.setCurrentItem(item.child(0))

【讨论】:

非常感谢!我为我的目的连接了错误的信号,itemClicked 有效!

以上是关于如何将 QTreeWidget 的子项设置为在单击其父项时自动选择并突出显示的主要内容,如果未能解决你的问题,请参考以下文章

QTreeWidget通过拖动重新排序子项

VLG 组件不扩展无论子项的长度如何

如何在 QTreeWidget 中设置小列宽?

QTreeWidget 交替行颜色设置

我在具有动态数据的 QtreeWidget 中的 QTreewidgetItem 中单击的编辑按钮

如何对 PyQt4 QTreeWidget 中的点击做出反应