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.utils import new_icon, label_validator BB = QDialogButtonBox class LabelDialog(QDialog): def __init__(self, text="Enter object label", parent=None, list_item=None): super(LabelDialog, self).__init__(parent) self.edit = QLineEdit() self.edit.setText(text) self.edit.setValidator(label_validator()) self.edit.editingFinished.connect(self.post_process) model = QStringListModel() model.setStringList(list_item) completer = QCompleter() completer.setModel(model) self.edit.setCompleter(completer) layout = QVBoxLayout() layout.addWidget(self.edit) self.button_box = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self) bb.button(BB.Ok).setIcon(new_icon('done')) bb.button(BB.Cancel).setIcon(new_icon('undo')) bb.accepted.connect(self.validate) bb.rejected.connect(self.reject) layout.addWidget(bb) if list_item is not None and len(list_item) > 0: self.list_widget = QListWidget(self) for item in list_item: self.list_widget.addItem(item) self.list_widget.itemClicked.connect(self.list_item_click) self.list_widget.itemDoubleClicked.connect(self.list_item_double_click) layout.addWidget(self.list_widget) 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 post_process(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 pop_up(self, text='', move=True): self.edit.setText(text) self.edit.setSelection(0, len(text)) self.edit.setFocus(Qt.PopupFocusReason) if move: cursor_pos = QCursor.pos() parent_bottom_right = self.parentWidget().geometry() max_x = parent_bottom_right.x() + parent_bottom_right.width() - self.sizeHint().width() max_y = parent_bottom_right.y() + parent_bottom_right.height() - self.sizeHint().height() max_global = self.parentWidget().mapToGlobal(QPoint(max_x, max_y)) if cursor_pos.x() > max_global.x(): cursor_pos.setX(max_global.x()) if cursor_pos.y() > max_global.y(): cursor_pos.setY(max_global.y()) self.move(cursor_pos) return self.edit.text() if self.exec_() else None def list_item_click(self, t_qlist_widget_item): try: text = t_qlist_widget_item.text().trimmed() except AttributeError: # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' text = t_qlist_widget_item.text().strip() self.edit.setText(text) def list_item_double_click(self, t_qlist_widget_item): self.list_item_click(t_qlist_widget_item) self.validate()