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

时间:2019-06-24 17:39:13

标签: python python-2.7 pyqt

我似乎找不到答案,我想将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。

谢谢, 标记

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来做到这一点,但感觉应该有一种更好的方法来达到我想要的结果。我将把这段代码留在这里,以防其他人需要它。

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