代码之家  ›  专栏  ›  技术社区  ›  Aaranos

从内部小部件访问QListWidgetItem

  •  1
  • Aaranos  · 技术社区  · 7 年前

    我试图找出如何将QWidget作为QListWidgetItem插入QListWidget中,以便能够访问它所属的列表,从而可以执行以下操作:

    • 增加/减少其在列表中的位置
    • 从列表中删除自身

    GUI示例:

    Example

    主要的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
    

    Creation\u initiative\u对象。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。

    编辑2:

    主要的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)
    

    Creation\u initiative\u对象。py将以下内容添加到InitCreatureObject类中

    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)
    

    项目仍未通过。父对象似乎是对的,但当我得到行时,它总是说-1。

    1 回复  |  直到 4 年前
        1
  •  3
  •   eyllanesc RAHUL KUMAR    7 年前

    获得 QTableWidgetItem 就是使用 itemAt() QTableWidgetItem

    由于主要目标是在发送信号时获取项目,因此使用连接的插槽,因此我建议将所有信号连接到该插槽。鉴于上述情况,采取以下步骤:

    • sender() .
    • 获取发件人 parent() 因为这将是添加到 QListWidget() 与项目一起。
    • pos() ,这是在
    • 然后你得到按钮的文本或一些参数,告诉我任务知道你想要做什么动作。

    上述内容可按以下方式实施:

    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)
    
    推荐文章