Easily editable QListWidget
In this QListWidget, persistent editor is automatically activated/deactivated when calling the addItem.
Persistent editor will be closed if you press enter or up or down key or click somewhere else after editing.
If you want to add the item consecutively, use setConsecutiveAddWhenEnterPressed(f: bool). You can add a new item again.
You can edit existing items to double-click it or press F2.
You have to call closeIfPersistentEditorStillOpen() before addItem. If you don't, old editor still remain open even though new editor was already opened.
PyQt5 >= 5.8
python -m pip install pyqt-editable-list-widget
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QPushButton, QApplication, QCheckBox, QDialog,
QVBoxLayout, QListWidgetItem, QWidget, QHBoxLayout, QLabel
from pyqt_editable_list_widget import EditableListWidget
class Dialog(QDialog):
def __init__(self):
super().__init__()
self.__initUi()
def __initUi(self):
# topWidget start
lbl = QLabel('Files')
lay = QHBoxLayout()
lay.setAlignment(Qt.AlignLeft)
lay.addWidget(lbl)
lay.setContentsMargins(0, 0, 0, 0)
topWidget = QWidget()
topWidget.setLayout(lay)
# topWidget end
# middleWidget start
allChkBox = QCheckBox('Check All')
left_lay = QHBoxLayout()
left_lay.setAlignment(Qt.AlignLeft)
left_lay.addWidget(allChkBox)
left_lay.setContentsMargins(0, 0, 0, 0)
btn_style = '''
QPushButton
{
border:0;
background:transparent;
padding:1px;
}
QPushButton:hover
{
background-color:#DDDDDD;
border-radius: 2px;
}
QPushButton:pressed
{
background-color:#FFFFFF;
border-radius: 2px;
}
QPushButton:checked
{
background-color: rgb(210, 210, 210);
border-radius: 2px;
border: none;
}
'''
addBtn = QPushButton()
addBtn.clicked.connect(self.__add)
addBtn.setStyleSheet(btn_style)
addBtn.setIcon(QIcon('./ico/add.png'))
addBtn.setToolTip('Add')
delBtn = QPushButton()
delBtn.clicked.connect(self.__delete)
delBtn.setStyleSheet(btn_style)
delBtn.setIcon(QIcon('./ico/delete.png'))
delBtn.setToolTip('Delete')
right_lay = QHBoxLayout()
right_lay.setAlignment(Qt.AlignRight)
right_lay.addWidget(addBtn)
right_lay.addWidget(delBtn)
right_lay.setContentsMargins(0, 0, 0, 0)
lay = QHBoxLayout()
lay.addLayout(left_lay)
lay.addLayout(right_lay)
lay.setContentsMargins(0, 0, 0, 0)
middleWidget = QWidget()
middleWidget.setLayout(lay)
# middleWidget end
# bottomWidget
self.__bottomWidget = EditableListWidget()
# mainWidget start
lay = QVBoxLayout()
lay.addWidget(topWidget)
lay.addWidget(middleWidget)
lay.addWidget(self.__bottomWidget)
lay.setContentsMargins(0, 0, 0, 0)
mainWidget = QWidget()
mainWidget.setLayout(lay)
lay = mainWidget.layout()
lay.setContentsMargins(5, 5, 5, 5)
self.setLayout(lay)
# mainWidget end
def __add(self):
self.__bottomWidget.closeIfPersistentEditorStillOpen() # You have to call this.
item = QListWidgetItem('abc')
self.__bottomWidget.addItem(item)
def __delete(self):
item = self.__bottomWidget.currentItem()
if item:
self.__bottomWidget.takeItem(self.__bottomWidget.currentRow())
if __name__ == "__main__":
app = QApplication(sys.argv)
dialog = Dialog()
dialog.show()
sys.exit(app.exec_())