<div dir="ltr">i have a treeWidget with itemWidget set on columns, but after dragging the widgets are gone, and the dropping indicator is opaque<br><br>1. How can i make the widget persist after dropping<br>2. How to make dropping indicator transparent ? ( i'm on centos 6.5, the compositing manager is not running)<br>
<br>screenshots are here:<br><br><a href="http://i.stack.imgur.com/d4sFP.png">http://i.stack.imgur.com/d4sFP.png</a><br><a href="http://i.stack.imgur.com/2Oa9A.png">http://i.stack.imgur.com/2Oa9A.png</a><br><br>executable example:<br>
<br> #!/usr/bin/env python2<br> import os<br> import sys<br> import re<br> <br> from PyQt4 import QtGui, QtCore<br> from PyQt4.QtCore import Qt, QString<br><br><br> class MyTreeWidget(QtGui.QTreeWidget):<br>
def __init__(self, parent=None):<br> super(MyTreeWidget, self).__init__(parent)<br> <br> class CommandWidget(QtGui.QDialog):<br> <br> def __init__(self, parent=None, level=0,script='echo /path/to/script'):<br>
super(CommandWidget, self).__init__()<br> self.layout = QtGui.QHBoxLayout(self)<br> <br> browseBtn = QtGui.QPushButton(parent)<br> <br> browseBtn.setMinimumSize(QtCore.QSize(0, 25))<br>
# level, path = val<br> <br> # levelNum = re.search('(?<=level).+', level).group()<br> browseBtn.setText('%s : %s' % (level, script))<br> self._level = int(level)<br>
self._script = script<br> browseBtn.setStyleSheet("text-align: left")<br> <br> self.layout.addWidget(browseBtn)<br> <br> # self.updateGeometry()<br> self.browseBtn = browseBtn<br>
# self.layout.addWidget(browseBtn)<br> self.browseBtn.clicked.connect(self.browseCommandScript)<br> self.browseBtn.setIconSize(QtCore.QSize(64, 64))<br> <br> def browseCommandScript(self):<br>
script = QtGui.QFileDialog.getOpenFileName(<br> self, 'Select Script file', '/home/xxx/python', ".py Files (*.py);;Executable Files (*)")<br> if script:<br> self._script = script<br>
button_label = re.search('[^\\/]*$',script).group()<br> self.browseBtn.setText(('%s : %s' % (self._level, button_label)))<br> <br> @property<br> def level(self):<br>
return self._level<br> <br> @level.setter<br> def level(self, value):<br> self._level = value<br> <br> @property<br> def script(self):<br> return self._script<br>
<br> @script.setter<br> def script(self, value):<br> self._script = value<br> <br> <br> class MyLineEdit(QtGui.QWidget):<br> def __init__(self,value=None,parent=None):<br> super(MyLineEdit,self).__init__(parent)<br>
self.layout = QtGui.QHBoxLayout(self)<br> self.layout.setSpacing(0)<br> self.layout.setMargin(3)<br> <br> self.lineEdit = QtGui.QLineEdit(value)<br> spacer1 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)<br>
spacer2 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)<br> <br> self.lineEdit.setContentsMargins(2,2,2,2)<br> self.lineEdit.setAlignment(Qt.AlignHCenter)<br>
<br> self.layout.addItem(spacer1)<br> self.layout.addWidget(self.lineEdit)<br> self.layout.addItem(spacer2)<br> <br> self.lineEdit.setMaximumSize(QtCore.QSize(70, 25))<br>
self.lineEdit.textEdited.connect(self._update_item_widget_data)<br> <br> def text(self):<br> return self.lineEdit.text()<br> <br> def setText(self,text):<br> return self.lineEdit.setText(text) <br>
<br> <br> def _update_item_widget_data(self,text):<br> # print 'update',text<br> self.treeWidgetItem.setData(1,Qt.UserRole,text)<br> <br> class TheUI(QtGui.QDialog):<br> <br>
def __init__(self, args=None, parent=None):<br> super(TheUI, self).__init__(parent)<br> self.layout = QtGui.QVBoxLayout(self)<br> treeWidget = MyTreeWidget()<br> <br> button = QtGui.QPushButton('Add')<br>
self.layout.addWidget(treeWidget)<br> self.cssEditTE = QtGui.QPlainTextEdit()<br> <br> self.layout.addWidget(button)<br> self.layout.addWidget(self.cssEditTE)<br> <br> self.cssEditTE.textChanged.connect(self._update_css)<br>
<br> treeWidget.setHeaderHidden(True)<br> treeWidget.setRootIsDecorated(False)<br> <br> layout = QtGui.QHBoxLayout(self)<br> rootDecorationCB = QtGui.QCheckBox('RootIsDecorated')<br>
layout.addWidget(rootDecorationCB)<br> self.layout.addLayout(layout)<br> rootDecorationCB.stateChanged.connect(self._update_root_decorated)<br> <br> indentationSlider = QtGui.QSlider()<br>
indentationSlider.setOrientation(Qt.Horizontal)<br> indentationSlider.setRange(0,100)<br> indentationSlider.setValue(20)<br> indentationSlider.valueChanged.connect(self._alter_indentation)<br>
layout.addWidget(indentationSlider)<br> <br> <br> self.layout.setStretchFactor(treeWidget,1)<br> <br> self.treeWidget = treeWidget<br> self.button = button<br> self.button.clicked.connect(lambda *x: self.addCmd())<br>
<br> HEADERS = ( "script", "chunksize", "mem" )<br> self.treeWidget.setHeaderLabels(HEADERS)<br> self.treeWidget.setColumnCount( len(HEADERS) )<br> <br>
self.treeWidget.setColumnWidth(0,200)<br> self.treeWidget.header().show()<br> <br> for i in range(len(HEADERS)):<br> self.treeWidget.headerItem().setTextAlignment(i,Qt.AlignHCenter)<br>
<br> <br> self.treeWidget.setDragDropMode(QtGui.QAbstractItemView.InternalMove)<br> <br> self.treeWidget.setIndentation(60)<br> <br> self.resize(500,700)<br> <br> for i in xrange(2):<br>
self.addCmd()<br> <br> item = self.addCmd()<br> self.addCmd(parent = item)<br> self.addCmd(parent = item)<br> item = self.addCmd()<br> <br> item=self.addCmd(parent = item)<br>
self.addCmd(parent = item)<br> self.addCmd()<br> <br> self.treeWidget.setColumnWidth(0,200)<br> <br> def addCmd(self, level=0, script='echo /path/to/script',parent=None):<br>
'add a level to tree widget'<br> <br> root = self.treeWidget.invisibleRootItem()<br> <br> if parent is None:<br> parent = root<br> item = QtGui.QTreeWidgetItem(parent)<br>
# item = QtGui.QTreeWidgetItem(self.treeWidget.invisibleRootItem())<br> item.setFlags(item.flags() | QtCore.Qt.ItemIsDropEnabled)<br> <br> existingLevels = self.treeWidget.topLevelItemCount()<br>
# level, path = val<br> # level = level % existingLevels<br> <br> cmdWidget = CommandWidget(self.treeWidget, existingLevels, script)<br> self.treeWidget.setItemWidget(item, 0, cmdWidget)<br>
<br> line_edit_1 = MyLineEdit('1')<br> line_edit_2 = MyLineEdit('200')<br> <br> self.treeWidget.setItemWidget(item, 1, line_edit_1)<br> self.treeWidget.setItemWidget(item, 2, line_edit_2)<br>
<br> item.setExpanded(True)<br> return item<br> <br> def _update_css(self):<br> self.treeWidget.setStyleSheet(self.cssEditTE.toPlainText())<br> <br> def _update_root_decorated(self,state):<br>
if state == Qt.Checked:<br> self.treeWidget.setRootIsDecorated(True)<br> else:<br> self.treeWidget.setRootIsDecorated(False)<br> self.treeWidget.updateGeometries()<br>
<br> def _alter_indentation(self,value):<br> print value<br> self.treeWidget.setIndentation(value)<br> self.treeWidget.updateGeometries()<br> <br> <br> <br> if __name__ == '__main__':<br>
app = QtGui.QApplication(sys.argv)<br> gui = TheUI()<br> gui.show()<br> app.exec_()<br><br><br></div>