将QToolButton附加到QTreeWidg标题中的特定列

2024-04-19 12:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我似乎找不到答案,我想把QToolButton附加到QTreeWidget上的特定列。理想情况下,我希望它在右边的列与一些文字在左边。我已经想出了如何附加到第一列没有文字,但我想它在第三列

我认为答案是使用setItemWidget和headerItem,但似乎可以让它们工作

如果有人能提出建议那就太棒了

from Qt import QtWidgets, QtCore, QtGui
import sys


class Main_window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.resize(900, 500)

        self.tree = HTreeWidget()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.setLayout(layout)

class HTreeWidget(QtWidgets.QTreeWidget):
    def __init__(self, *args, **kargs):
        QtWidgets.QTreeWidget.__init__(self, *args, **kargs)

        self.header_labels = ["header 1", "header 2", "header 3", "header 4"]
        self.setColumnCount(len(self.header_labels))
        self.setHeaderLabels(self.header_labels)

        header = self.header()

        button = QtWidgets.QToolButton(header)
        button.setArrowType(QtCore.Qt.DownArrow)
        button.clicked.connect(self.menu)

        action_group = QtWidgets.QActionGroup(self, exclusive=True)
        self.filter_checked_out = action_group.addAction(QtWidgets.QAction('Filter 1', self, checkable=True))
        self.filter_checked_in = action_group.addAction(QtWidgets.QAction('Filter 2', self, checkable=True))
        self.no_filter = action_group.addAction(QtWidgets.QAction('No Filter', self, checkable=True))
        self.no_filter.setChecked(True)

    def menu(self):
        menu = QtWidgets.QMenu(self)

        menu.addAction(self.filter_checked_out)
        menu.addAction(self.filter_checked_in)
        menu.addAction(self.no_filter)

        menu.exec_(QtGui.QCursor().pos())

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = Main_window()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()

所以我想头3有一个下拉列表与过滤器列表。有能力扩展,最终以不同的下拉列表标题4

谢谢你, 标记


Tags: selftrueinitdefgroupactionfilterwindow
1条回答
网友
1楼 · 发布于 2024-04-19 12:27:20

我找到了一种方法,但是我觉得应该有更好的方法来达到我想要的结果。我会把这个代码留在这里,只是把需要它的人包起来

from Qt import QtWidgets, QtCore, QtGui
import sys


class Main_window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.resize(900, 500)

        self.tree = HTreeWidget()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.setLayout(layout)

class HTreeWidget(QtWidgets.QTreeWidget):
    def __init__(self, *args, **kargs):
        QtWidgets.QTreeWidget.__init__(self, *args, **kargs)

        self.header_labels = ["header 1", "header 2", "header 3", "header 4"]
        self.setColumnCount(len(self.header_labels))
        self.setHeaderLabels(self.header_labels)

        self.header = self.header()

        self.btn = QtWidgets.QToolButton(self.header)
        self.btn.setArrowType(QtCore.Qt.DownArrow)
        self.btn.setMinimumSize(QtCore.QSize(15, 15))
        self.btn.setMaximumSize(QtCore.QSize(15, 15))
        self.btn.clicked.connect(self.menu)

        self.header.sectionResized.connect(self.on_column_move)
        self.header.sectionMoved.connect(self.on_column_move)

        action_group = QtWidgets.QActionGroup(self, exclusive=True)
        self.filter_checked_out = action_group.addAction(QtWidgets.QAction('Filter 1', self, checkable=True))
        self.filter_checked_in = action_group.addAction(QtWidgets.QAction('Filter 2', self, checkable=True))
        self.no_filter = action_group.addAction(QtWidgets.QAction('No Filter', self, checkable=True))
        self.no_filter.setChecked(True)

    def on_column_move(self):
        self.btn.move(self.header.sectionPosition(2) + self.header.sectionSize(2) - 20, 3)

    def menu(self):
        menu = QtWidgets.QMenu(self)

        menu.addAction(self.filter_checked_out)
        menu.addAction(self.filter_checked_in)
        menu.addAction(self.no_filter)

        menu.exec_(QtGui.QCursor().pos())

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = Main_window()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()

相关问题 更多 >