2014-03-18 2 views
5

이 코드는 하나의 QListWidget과 하나의 QPushButton이있는 대화 상자를 만듭니다.PyQt : 대부분의 QListWidget을 얻는 방법

단추를 클릭하면 단일 목록 항목이 추가됩니다.

목록 항목을 마우스 오른쪽 버튼으로 클릭하면 "항목 제거"명령을 사용할 수있는 마우스 오른쪽 버튼 메뉴가 나타납니다.

"항목 제거"명령을 선택하면 목록 위젯에서 목록 항목이 제거됩니다. 위 아래로 (- 배열 재) 목록 항목을 이동하는

  1. 능력을 :

    는 다음 ListWidgets의 작전이 구현 될 수있는 방법을 지켜 보는 것도 흥미로울 것이다.
  2. 목록 항목을 여러 개 선택하고 여러 번 삭제할 수 있습니다.
  3. 더 강력한 목록 항목 정렬.

예 :

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_()) 
+1

, 당신은 삽입, 삭제, 정렬, 정렬 등을 처리 할 때, 당신은 일반적으로이 'QListWidget' (항목 기반)보다'QListView' (뷰 모델 기반)를 사용하는 것이 더 좋습니다. 'QAbstractItemModel'은 정렬, 삽입 등에 필요한 모든 슬롯을 가지고 있습니다. – Hyperboreus

+0

3 번 항목에서 : "더 좋고"더 강건한 것은 무엇을 의미합니까? – ekhumoro

+0

이제 sort()는 'Item 2', 'Item 20', 'Item 3', 'Item 4'등의 문자열을 나열합니다.이 간단한 문자열 정렬에는 논리가 없습니다. 둘째, listItem 이름과 QT 객체가 self.listItems 사전에 정렬되어 동일한 이름을 가진 둘 이상의 목록 항목이 사전 키로 사용되기 때문에 만들 수 없도록합니다. 나는 더 나은 '인기있는'다른 방법이 있는지 궁금해. 왜냐하면 내가 여기 사용한 방식은 모두 내 머리에서 나온 것이기 때문이다. – alphanumeric

답변

17

목록 - 위젯 항목까지 이동할 수 아래로 드래그 앤 드롭을 통해,하지만 기본적으로 사용할 수 없습니다. 그것을 전환하려면 다음을 수행하십시오

self.listWidget.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 

다중 선택 selection-modes 가능한 여러 중 하나입니다. 스위치를 켜려면 다음을 수행하십시오.

self.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

정렬은 기본적으로 비활성화되어 있습니다. 그것을 전환하려면 다음을 수행하십시오

self.listWidget.setSortingEnabled(True) 

다음 중 하나를, 목록을 다시 정렬하려면 :

self.listWidget.sortItems() # ascending by default 
    self.listWidget.sortItems(QtCore.Qt.DescendingOrder) 

정렬 알파벳과 대소 문자를 구분 기본적으로 있습니다. 사용자 지정 정렬 순서, 서브 클래스 QListWidgetItem 다시 구현을 원하는 경우의 연산자보다 적게보다는 :

내 경험에
class ListWidgetItem(QtGui.QListWidgetItem): 
    def __lt__(self, other): 
     return self.text() < other.text() # or whatever