* Add item single click slot in labelDialog.py In the original code, double clicking a list item will set the text property and automatically validate afterwards, with the label dialog window disappearing. In this revised version, double click behavior is unchanged, while single click is added. When single clicking a list item, it will only set text in the QLineEdit. Users can change the text by clicking other items before validating themselves by clicking yes.
84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
try:
|
|
from PyQt5.QtGui import *
|
|
from PyQt5.QtCore import *
|
|
from PyQt5.QtWidgets import *
|
|
except ImportError:
|
|
from PyQt4.QtGui import *
|
|
from PyQt4.QtCore import *
|
|
|
|
from libs.lib import newIcon, labelValidator
|
|
|
|
BB = QDialogButtonBox
|
|
|
|
|
|
class LabelDialog(QDialog):
|
|
|
|
def __init__(self, text="Enter object label", parent=None, listItem=None):
|
|
super(LabelDialog, self).__init__(parent)
|
|
|
|
self.edit = QLineEdit()
|
|
self.edit.setText(text)
|
|
self.edit.setValidator(labelValidator())
|
|
self.edit.editingFinished.connect(self.postProcess)
|
|
|
|
model = QStringListModel()
|
|
model.setStringList(listItem)
|
|
completer = QCompleter()
|
|
completer.setModel(model)
|
|
self.edit.setCompleter(completer)
|
|
|
|
layout = QVBoxLayout()
|
|
layout.addWidget(self.edit)
|
|
self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
|
|
bb.button(BB.Ok).setIcon(newIcon('done'))
|
|
bb.button(BB.Cancel).setIcon(newIcon('undo'))
|
|
bb.accepted.connect(self.validate)
|
|
bb.rejected.connect(self.reject)
|
|
layout.addWidget(bb)
|
|
|
|
if listItem is not None and len(listItem) > 0:
|
|
self.listWidget = QListWidget(self)
|
|
for item in listItem:
|
|
self.listWidget.addItem(item)
|
|
self.listWidget.itemClicked.connect(self.listItemClick)
|
|
self.listWidget.itemDoubleClicked.connect(self.listItemDoubleClick)
|
|
layout.addWidget(self.listWidget)
|
|
|
|
self.setLayout(layout)
|
|
|
|
def validate(self):
|
|
try:
|
|
if self.edit.text().trimmed():
|
|
self.accept()
|
|
except AttributeError:
|
|
# PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
|
|
if self.edit.text().strip():
|
|
self.accept()
|
|
|
|
def postProcess(self):
|
|
try:
|
|
self.edit.setText(self.edit.text().trimmed())
|
|
except AttributeError:
|
|
# PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
|
|
self.edit.setText(self.edit.text())
|
|
|
|
def popUp(self, text='', move=True):
|
|
self.edit.setText(text)
|
|
self.edit.setSelection(0, len(text))
|
|
self.edit.setFocus(Qt.PopupFocusReason)
|
|
if move:
|
|
self.move(QCursor.pos())
|
|
return self.edit.text() if self.exec_() else None
|
|
|
|
def listItemClick(self, tQListWidgetItem):
|
|
try:
|
|
text = tQListWidgetItem.text().trimmed()
|
|
except AttributeError:
|
|
# PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
|
|
text = tQListWidgetItem.text().strip()
|
|
self.edit.setText(text)
|
|
|
|
def listItemDoubleClick(self, tQListWidgetItem):
|
|
self.listItemClick(tQListWidgetItem)
|
|
self.validate()
|