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