我有 3 三张图片,如下所示:
如何让 QLineEdit 和 QPushButton 在 PyQt5 的 tableview 中以这样的列和样式显示?
我有以下三张图片,如下所示,
我想编写一个通过 PyQt5 实现这些功能的 GUI:
- 单击鼠标一次,它会选择这一行,并高亮这一行1。就像数字1点到
几秒钟后,在“单击此处添加文件”再次单击鼠标一次,它将进入编辑模式。就像数字 2 点一样,QLineEdit 和 QPushButton '...' 将显示在第二列。如果我单击“...”,并弹出一个文件选择对话框,当我选择一个文件时,它将用文件绝对路径替换“单击此处添加文件”。
注意:不是双击鼠标进入编辑模式,应该是单击鼠标一次,几秒钟后,再次单击鼠标,将进入编辑模式。当我选择一个绝对路径非常长的文件时。我可以在 QPushButton '...' 后面看到一些字符显示,看起来 QPushButton 在 QLineEdit 的右侧重叠。
- 完成第 2 步后,如果继续在另一行单击鼠标,则第 2 步中的 QLineEdit 和 QPushButton '...' 将消失,如行 'VAR("myModelConer")
我研究了 3 个功能很多天,但无法获得我想要的风格。我将在这里给出我的代码,例如,它是 2 行和 2 列。任何人都可以帮助我修改和完成以上 3 个功能。
提前致谢
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Delegate(QStyledItemDelegate):
def __init__(self, parent=None):
super(Delegate, self).__init__(parent)
def createEditor(self, parent, option, index):
if index.column() == 0:
lineedit = QLineEdit("$woroot/1.scs",parent)
pushbutton = QPushButton("...", parent)
#lineedit = QLineEdit("..",self.parent())
#pushbutton = QPushButton("...", self.parent())
lineedit.index = [index.row(), index.column()]
pushbutton.index = [index.row(), index.column()]
h_box_layout = QHBoxLayout()
h_box_layout.addWidget(lineedit)
h_box_layout.addWidget(pushbutton)
h_box_layout.setContentsMargins(0, 0, 0, 0)
h_box_layout.setAlignment(Qt.AlignCenter)
widget = QWidget()
widget.setLayout(h_box_layout)
self.parent().setIndexWidget(
index,
widget
)
elif index.column() == 1:
combobox = QComboBox(parent)
combobox.addItems(section_list)
combobox.setEditable(True)
#combobox.editTextChanged.connect(self.commitAndCloseEditor)
return combobox
def setEditorData(self, editor, index):
text = index.model().data(index, Qt.DisplayRole)
print "setEditorData, text=", text
text = str(text)
i = editor.findText(text)
print "i=", i
if i == -1:
i = 0
editor.setCurrentIndex(i)
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)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
model = QStandardItemModel(4, 2)
tableView = QTableView()
tableView.setModel(model)
delegate = Delegate(tableView)
tableView.setItemDelegate(delegate)
section_list = ['w','c','h']
for row in range(4):
for column in range(2):
index = model.index(row, column, QModelIndex())
model.setData(index, (row + 1) * (column + 1))
tableView.setWindowTitle("Spin Box Delegate")
tableView.show()
sys.exit(app.exec_())