Я работаю на win7 + python2 .7 + PyQt5,
Я написал простой пример QTreeWidget.
, но я столкнулся с двумя вопросами.
- когда я один раз щелкаю мышью, он может выбрать эту строку. и через несколько секунд я бы хотел один раз щелкнуть мышью во 2-м столбце, 2-й столбец может войти в режим редактирования. Мой код только дважды щелкните по модулю, чтобы войти в режим редактирования. это не моя необходимость.
- , когда 2-й столбец входит в режим редактирования. Я обнаружил, что размер шрифта QComboBox стал небольшим по сравнению с режимом отображения. но я надеюсь, что размер шрифта в режиме редактирования должен совпадать с режимом отображения. Я использую стиль QSS для управления отображением QTreeWidget.
Это мой результат выполнения кода.
Может ли кто-нибудь помочь мне решить 2 вопроса?
Заранее спасибо
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
section_list = []
class QComboBoxDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
super(QComboBoxDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
if index.column() == 1:
combobox = QComboBox(parent)
combobox.addItems(section_list)
combobox.setEditable(True)
return combobox
def setEditorData(self, editor, index):
text = index.model().data(index, Qt.DisplayRole)
text = str(text)
i = editor.findText(text)
if i == -1:
i = 0
if text != "" and text not in section_list:
section_list.append(text)
editor.setCurrentText(text)
editor.lineEdit().selectAll()
def setModelData(self, editor, model, index):
text = editor.currentText()
if len(text) >= 1:
model.setData(index, text)
def updateEditorGeometry(self, editor, option, index):
editor.setGeometry(option.rect)
def commitAndCloseEditor(self):
editor = self.sender()
if isinstance(editor, (QTextEdit, QLineEdit,QSpinBox,QComboBox)):
self.commitData[QWidget].emit(editor)
self.closeEditor[QWidget].emit(editor)
class TreeWidgetDemo(QWidget):
def __init__(self, parent=None):
super(TreeWidgetDemo, self).__init__(parent)
self.setWindowTitle('TreeWidget example')
self.dataGroupBox = QGroupBox("Inbox")
self.treewidget = QTreeWidget()
self.treewidget.setColumnCount(2)
self.treewidget.setHeaderLabels(['QCheckBox', 'Section'])
self.treewidget.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken);
import codecs
with codecs.open(r'.\qtreewidget.qss','r','utf-8') as f:
stylesheet = f.readlines()
style = '\r\n'.join(stylesheet)
self.treewidget.setStyleSheet(style)
dataLayout = QHBoxLayout()
dataLayout.addWidget(self.treewidget)
self.dataGroupBox.setLayout(dataLayout)
self.root=QTreeWidgetItem(self.treewidget)
self.root.setText(0,'PROJ')
self.root.setIcon(0,QIcon('./images/self.root.png'))
self.root.setText(1,' ')
self.root.setFlags(self.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
self.treewidget.setColumnWidth(0, 200)
self.treewidget.setColumnWidth(1, 300)
model_list = [
[ "$proj/1.c", "tt" ],
[ "$proj/2.c", "ss" ],
[ "$proj/3.s", "" ],
[ "$proj/4.s", "" ],
]
for i in model_list:
print i
self.child=QTreeWidgetItem(self.root)
self.child.setCheckState(0, Qt.Checked)
self.child.setText(1, i[0])
if i[len(i) - 1] != "":
section_list.append(i[len(i) - 1])
self.child.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable)
self.treewidget.addTopLevelItem(self.root)
self.treewidget.setItemDelegateForColumn(1, QComboBoxDelegate(self.treewidget))
self.treewidget.expandAll()
mainLayout = QVBoxLayout()
mainLayout.addWidget(self.dataGroupBox)
self.setLayout(mainLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
tree = TreeWidgetDemo()
tree.resize(500,500)
tree.show()
sys.exit(app.exec_())
это мой qtreewidget.qss файл
QTreeWidget {
color:rgb(0,0,255);
border:3px solid rgb(250,0,0);
font-size:14pt;
}
QTreeWidget::item {
height:30px;
margin:1px;
padding:0px;
border:2px solid rgb(0,255,0);
}
QTreeWidget::item:hover {
show-decoration-selected:1;
background-color: rgb(255, 0, 0);
selection-background-color: rgb(0, 0, 0);
color: rgb(0,0,255);
}
QTreeWidget::item:selected {
show-decoration-selected:1;
selection-background-color: rgb(37, 44, 50);
color: rgb(0, 255, 0);
}