이 코드는 하나의 QListWidget과 하나의 QPushButton이있는 대화 상자를 만듭니다.PyQt : 대부분의 QListWidget을 얻는 방법
단추를 클릭하면 단일 목록 항목이 추가됩니다.
목록 항목을 마우스 오른쪽 버튼으로 클릭하면 "항목 제거"명령을 사용할 수있는 마우스 오른쪽 버튼 메뉴가 나타납니다.
"항목 제거"명령을 선택하면 목록 위젯에서 목록 항목이 제거됩니다. 위 아래로 (- 배열 재) 목록 항목을 이동하는
- 능력을 : 는 다음 ListWidgets의 작전이 구현 될 수있는 방법을 지켜 보는 것도 흥미로울 것이다.
- 목록 항목을 여러 개 선택하고 여러 번 삭제할 수 있습니다.
- 더 강력한 목록 항목 정렬.
예 :
import sys, os
from PyQt4 import QtCore, QtGui
class ThumbListWidget(QtGui.QListWidget):
def __init__(self, type, parent=None):
super(ThumbListWidget, self).__init__(parent)
self.setAcceptDrops(True)
self.setIconSize(QtCore.QSize(124, 124))
def dragEnterEvent(self, event):
if event.mimeData().hasUrls:
event.accept()
else:
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasUrls:
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
else:
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasUrls:
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
links = []
for url in event.mimeData().urls():
links.append(str(url.toLocalFile()))
self.emit(QtCore.SIGNAL("dropped"), links)
else:
event.ignore()
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
self.listItems={}
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.myListWidget = ThumbListWidget(self)
self.myListWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.myListWidget.connect(self.myListWidget, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.listItemRightClicked)
myButton = QtGui.QPushButton("Add List Item")
myBoxLayout.addWidget(self.myListWidget)
myBoxLayout.addWidget(myButton)
myButton.clicked.connect(self.addListWidgetItem)
def addListWidgetItem(self):
listItemName='Item '+str(len(self.listItems.keys()))
self.listItems[listItemName]=None
self.rebuildListWidget()
def listItemRightClicked(self, QPos):
self.listMenu= QtGui.QMenu()
menu_item = self.listMenu.addAction("Remove Item")
if len(self.listItems.keys())==0: menu_item.setDisabled(True)
self.connect(menu_item, QtCore.SIGNAL("triggered()"), self.menuItemClicked)
parentPosition = self.myListWidget.mapToGlobal(QtCore.QPoint(0, 0))
self.listMenu.move(parentPosition + QPos)
self.listMenu.show()
def menuItemClicked(self):
if len(self.listItems.keys())==0: print 'return from menuItemClicked'; return
currentItemName=str(self.myListWidget.currentItem().text())
self.listItems.pop(currentItemName, None)
self.rebuildListWidget()
def rebuildListWidget(self):
self.myListWidget.clear()
items=self.listItems.keys()
if len(items)>1: items.sort()
for listItemName in items:
listItem = QtGui.QListWidgetItem(listItemName, self.myListWidget)
self.listItems[listItemName]=listItem
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
, 당신은 삽입, 삭제, 정렬, 정렬 등을 처리 할 때, 당신은 일반적으로이 'QListWidget' (항목 기반)보다'QListView' (뷰 모델 기반)를 사용하는 것이 더 좋습니다. 'QAbstractItemModel'은 정렬, 삽입 등에 필요한 모든 슬롯을 가지고 있습니다. – Hyperboreus
3 번 항목에서 : "더 좋고"더 강건한 것은 무엇을 의미합니까? – ekhumoro
이제 sort()는 'Item 2', 'Item 20', 'Item 3', 'Item 4'등의 문자열을 나열합니다.이 간단한 문자열 정렬에는 논리가 없습니다. 둘째, listItem 이름과 QT 객체가 self.listItems 사전에 정렬되어 동일한 이름을 가진 둘 이상의 목록 항목이 사전 키로 사용되기 때문에 만들 수 없도록합니다. 나는 더 나은 '인기있는'다른 방법이 있는지 궁금해. 왜냐하면 내가 여기 사용한 방식은 모두 내 머리에서 나온 것이기 때문이다. – alphanumeric