2017-09-12 3 views
0

나는 내가 그것을이 작업을 수행 할 수 있도록의 일부 목록에 액세스 할 수 있어야하는 QListWidgetItem로 QListWidget에 삽입는 QWidget을 얻을 수있는 방법을 알아 내려고 노력하고있어 내부 위젯에서 QListWidgetItem에 접근 다음PyQt4는

  • 증가/목록에서 위치의 감소
  • 는 메인 클래스

내 스크립트 layo의 함수에 자신의 클래스에서 목록에서

  • 패스 정보를 자체를 제거 ut는 MainWindow 클래스가있는 main.py입니다. MainWindow는 메인 ui 파일에서 생성 된 클래스를 사용합니다. 나는 또한 그것이 자신의 클래스 인 커스텀 위젯을 가지고있다. GUI의

    예 :

    Example

    관련 코드 단편 :

    main.py

    from PyQt4.QtGui import QMainWindow, QApplication 
    from dungeonjournal import Ui_MainWindow 
    from creature_initiative_object import InitCreatureObject 
    from os import walk 
    
    class MainWindow(QMainWindow, Ui_MainWindow): 
        def __init__(self, parent=None): 
         super(QMainWindow, self).__init__(parent) 
         self.setupUi(self) 
         etc...... 
        def AddToInitiative(self): 
         creature = self.comboBoxSelectCharacter.currentText() 
         if(creature): 
          creatureInfo = '' 
          with open("creatures/"+str(creature)+".creature", "r") as f: 
           creatureInfo = f.read() 
          creatureInfo = creatureInfo.split("|") 
    
          customWidget = InitCreatureObject() 
          customWidgetItem = QtGui.QListWidgetItem(self.initiativeList) 
          customWidgetItem.setSizeHint(QtCore.QSize(400,50)) 
          self.initiativeList.addItem(customWidgetItem) 
          self.initiativeList.setItemWidget(customWidgetItem, customWidget) 
          customWidget.setName(creatureInfo[0]) 
         return 
    

    creature_initiative_object.py

    class Ui_InitCreatureObject(object): 
        def setupUi(self, InitCreatureObject): 
         etc... 
    
    class InitCreatureObject(QtGui.QWidget, Ui_InitCreatureObject): 
        def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()): 
         QtGui.QWidget.__init__(self, parent, f) 
    
         self.setupUi(self) 
    

    편집 1 : 내가 목록에 자신의 위치를 ​​수정하는 위젯에있는 버튼을 사용 할 수 있어야합니다, 다시 명확합니다. 목록은 주 UI의 일부입니다. 위쪽 화살표, 아래쪽 화살표, 선택 및 제거 버튼은 클래스 외부의 것들과 상호 작용하려고 시도하는 버튼입니다.

    가되는 listItem이 호출되고 판별 할 수 있어야 전화 기능, 목록을 수정할 수 있습니다. 내가 제거를 클릭하면

    는 예를 들어, 다음 제거하려면 목록에있는 항목을 알 필요가있다. 따라서 목록이 무엇인지 먼저 알아야하며 항목이 무엇인지 알아야합니다. 해당 목록 항목을 차지하는 위젯의 인스턴스에 액세스하는 방법을 모르겠습니다. 또한 listitem의 클래스 내부에서 버튼을 눌러 그 listitem을 얻는 방법을 모르겠습니다.

    편집 2 : 첫 번째 대답은 당이 내 코드에 그 일을하려고 노력했다.

    main.py는 다음과 같은 기능이

    def RemoveItem(self): 
         cwidget = self.sender().parent() 
         item = self.initiativeList.itemAt(cwidget.pos()) 
         row = self.initiativeList.row(item) 
         self.initiativeList.takeItem(row) 
         print(row) 
    

    creature_initiative_object.py가

    class InitCreatureObject(QtGui.QWidget, Ui_InitCreatureObject): 
        def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()): 
         QtGui.QWidget.__init__(self, parent, f) 
         self.setupUi(self) 
         self.mainwidget = main.MainWindow() 
         self.btnRemove.clicked.connect(self.mainwidget.RemoveItem) 
    

    항목은 아직 통과되지 않고있는 InitCreatureObject 클래스에 추가 다음 한 추가했다. 부모 개체는 옳은 것처럼 보이지만 행을 가져 오면 항상 -1이 표시됩니다.

  • +0

    더 나은 설명 , 위젯 (InitCreatureObject)을 가져오고, 컨텍스트를 설명하고, 원하는 목록에서 그 위치로 할 때 또는 어떤 이벤트를 실현할 때 – eyllanesc

    +0

    @eyllanesc 메인 포스트에 추가하여 좀 더 명확히하기 위해 추가했습니다. 매우 틈새 문제이므로 설명하기가 어렵습니다. – Aaranos

    +0

    다음 줄'self.mainwidget = main.MainWindow() self.btnRemove.clicked.connect (self.mainwidget.RemoveItem)'이 새 창을 만들고 있는데, main.py 파일에 내 논리를 구현하는 것이 좋습니다 – eyllanesc

    답변

    0

    QTableWidgetItem을 얻는 전략은 itemAt() 방법을 사용하는 것이지만 내에서 어떤 지점의 위치를 ​​알아야합니다.

    주요 목적은 신호가 다음 접속 슬롯이 사용되며, 전송 될 때 아이템을 얻을 수있다, 그래서 그 슬롯에 모든 신호를 연결하기 때문에 권장.위에서 주어진 단계는 다음과 같습니다.

    • sender()을 통해 신호를 내보내는 객체를 가져옵니다.
    • 발신자가 parent()인데 이는 해당 항목과 함께 QListWidget()에 추가 된 맞춤 위젯이 될 것이기 때문입니다.
    • 을 통해 맞춤 위젯의 위치를 ​​가져 오려면 itemAt() 메소드에서 사용해야하는 위치입니다.
    • 그런 다음 버튼의 텍스트 나 수행 할 작업을 알 수있는 매개 변수가 표시됩니다. 다음과 같이

    위 구현할 수 있습니다 위부터

    def someSlot(self): 
        p = self.sender().parent() 
        it = self.lw.itemAt(p.pos()) 
        text = self.sender().text() 
        if text == "task1": 
         do task1 
        elif text == "task2": 
         do task2  
    

    를, 다음의 예는 제안한다 :

    class CustomWidget(QWidget): 
        def __init__(self, text, parent=None): 
         QWidget.__init__(self, parent) 
         self.setLayout(QHBoxLayout()) 
         self.buttons = [] 
         vb = QVBoxLayout() 
         self.layout().addLayout(vb) 
         self.btnTask1 = QPushButton("task1") 
         self.btnTask2 = QPushButton("task2") 
    
         vb.addWidget(self.btnTask1) 
         vb.addWidget(self.btnTask2) 
    
         self.buttons.append(self.btnTask1) 
         self.buttons.append(self.btnTask2) 
    
         self.btnTask3 = QPushButton("task3") 
         self.btnTask4 = QPushButton("task4") 
         self.btnTask5 = QPushButton("task5") 
         self.btnTask6 = QPushButton("task6") 
         self.layout().addWidget(self.btnTask3) 
         self.layout().addWidget(self.btnTask4) 
         self.layout().addWidget(self.btnTask5) 
         self.layout().addWidget(self.btnTask6) 
    
         self.buttons.append(self.btnTask3) 
         self.buttons.append(self.btnTask4) 
         self.buttons.append(self.btnTask5) 
         self.buttons.append(self.btnTask6) 
    
    
    class MainWindow(QMainWindow): 
        def __init__(self, parent=None): 
         QMainWindow.__init__(self, parent) 
         self.lw = QListWidget(self) 
         self.setCentralWidget(self.lw) 
         for i in range(5): 
          cw = CustomWidget("{}".format(i)) 
          for btn in cw.buttons: 
           btn.clicked.connect(self.onClicked) 
    
          item = QListWidgetItem(self.lw) 
          item.setSizeHint(QSize(400, 80)) 
          self.lw.addItem(item) 
          self.lw.setItemWidget(item, cw) 
    
        def onClicked(self): 
         p = self.sender().parent() 
         it = self.lw.itemAt(p.pos()) 
         row = self.lw.row(it) 
         text = self.sender().text() 
         print("item {}, row {}, btn: {}".format(it, row, text)) 
         #if text == "task1": 
         # do task1 
         #elif text == "task2": 
         # do task2  
    
    
    
    if __name__ == '__main__': 
        app = QApplication(sys.argv) 
        w = MainWindow() 
        w.show() 
        sys.exit(app.exec_()) 
    

    귀하의 경우 :

    class MainWindow(QMainWindow, Ui_MainWindow): 
        [...] 
        def AddToInitiative(self): 
         [...] 
         customWidget = InitCreatureObject() 
         customWidget.btnRemove.clicked.connect(self.RemoveItem) 
         # ^^^^^ 
         [...] 
        def RemoveItem(self): 
         cwidget = self.sender().parent() 
         item = self.initiativeList.itemAt(cwidget.pos()) 
         row = self.initiativeList.row(item) 
         self.initiativeList.takeItem(row) 
         print(row) 
    
    +0

    저는 ' 그래도 여전히 당신의 대답으로 일하도록 노력하고 있습니다. 문제는 내 스크립트와 같은 논리를 사용하지 않는 것입니다. 내 위젯은 버튼 누름에서 동적으로 추가되며 각 버튼은 다른 것을해야하므로 onClicked는 모든 버튼에 링크되어있어 아무 것도하지 않습니다. 그것 뒤에 아이디어는 내가 항목을 얻을 수있게해야하지만 그렇지 않습니다. 항목에 액세스하려고 할 때마다 어떤 위젯의 버튼을 눌러도 행 수는 -1이됩니다. – Aaranos

    +0

    각 단추가 다른 작업을 수행한다는 것을 알고 있습니다. 그 정보로 텍스트를 인쇄하면 수행 할 작업을 알 수 있습니다. 솔루션을 구현하는 데 문제가 있으면 코드를 공유하기 만하면됩니다. – eyllanesc

    +0

    제안과 도움을 주셔서 감사합니다. 그러나 저는 지금 당장 그것에 앉아있을 것이라고 생각합니다. 그것이 어떻게 작동하는지 이해하지 못한다면 나중에 프로그램에 문제가 생길 것입니다. 내가 작성한 코드를 테스트했는데 코드가 자체적으로 작동합니다. 아직 구현하지 못했습니다. 보낸 사람과 보낸 사람의 부모는 내 문제이므로 내 사례와 달리 중첩 된 것입니다. – Aaranos