I want to have a QTreeWidget with hierarchical items where one column contains a custom widget. I created a custom widget that contains a QLabel and a QSpinBox in a horizontal layout.
MySlider.py looks like this:
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.Qt import Qt
import sys
class MySlider(QtWidgets.QWidget):
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
self.horizontalLayoutWidget = QtWidgets.QWidget(parent)
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label.setText('Spinbox:')
self.spinBox1 = QtWidgets.QSpinBox(self.horizontalLayoutWidget)
self.horizontalLayout.addWidget(self.label)
self.horizontalLayout.addWidget(self.spinBox1)
Then I want to create a QTreeWidget where the third column is filled with a MySlider
widget. The application looks like this:
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QAbstractItemView
from MySlider import MySlider
def main():
_translate = QtCore.QCoreApplication.translate
app = QtWidgets.QApplication(sys.argv)
tree = QtWidgets.QTreeWidget()
tree.setColumnCount(3)
headerItem = QtWidgets.QTreeWidgetItem()
headerItem.setText(0, _translate("MainWindow", "md-name"))
headerItem.setText(1, _translate("MainWindow", "md_value"))
headerItem.setText(2, _translate("MainWindow", "others"))
tree.setHeaderItem(headerItem)
parent = QtWidgets.QTreeWidgetItem(tree)
parent.setText(0, "Parent 1")
parent.setText(1, "")
parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsEditable)
for x in range(3):
child = QtWidgets.QTreeWidgetItem(parent)
child.setFlags(child.flags() | Qt.ItemIsEditable)
child.setText(0, "Child {}".format(x))
line_edit = QtWidgets.QLineEdit(tree)
rs = MySlider(tree)
tree.setItemWidget(child, 1, line_edit)
tree.setItemWidget(child, 2, rs)
tree.setEditTriggers(QAbstractItemView.AllEditTriggers)
tree.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
The problem is: the custom widget is not placed in the third column as wished, but is shown in the top-left corner of the window. Has anyone any idea why it goes wrong?