Как сделать так, чтобы размер шрифта QComboBox в режиме редактирования совпадал с режимом отображения? - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю на win7 + python2 .7 + PyQt5,

Я написал простой пример QTreeWidget.

, но я столкнулся с двумя вопросами.

  1. когда я один раз щелкаю мышью, он может выбрать эту строку. и через несколько секунд я бы хотел один раз щелкнуть мышью во 2-м столбце, 2-й столбец может войти в режим редактирования. Мой код только дважды щелкните по модулю, чтобы войти в режим редактирования. это не моя необходимость.
  2. , когда 2-й столбец входит в режим редактирования. Я обнаружил, что размер шрифта QComboBox стал небольшим по сравнению с режимом отображения. но я надеюсь, что размер шрифта в режиме редактирования должен совпадать с режимом отображения. Я использую стиль QSS для управления отображением QTreeWidget.

Это мой результат выполнения кода. proj

Может ли кто-нибудь помочь мне решить 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);
}
...