如何在单击其中的widget [child]时选择QListWidgetItem

问题描述 投票:2回答:1

我创建了一个QListWidget ... QListWidgetItem由QHushLutout内部的QPushButton和QLineEdit组成...

QListWidgetItem中的QPushButton链接到应该在单击时从QListWidget中删除当前QListWidgetItem的函数...

我正在使用方法“takeItem()”传递方法“currentRow()”的输出来删除条目...

问题是当我点击删除按钮时没有选择QListWidgetItem,因此“currentRow()”不返回任何内容......

我的问题:当我点击删除按钮后,如何让QListWidgetItem条目被选中...

import sys
from PyQt4 import QtGui, QtCore

def Add_OtherItem():
    ItemOther = CustomItem()
    ItemOther.SetupItem(OthersCommandsWidget)

def Delete_OtherItem():
    OthersCommandsWidget.takeItem(OthersCommandsWidget.currentRow())

app = QtGui.QApplication(sys.argv)

class CustomItem(object):

    def SetupItem(self, OthersCommandList):

        self.Item = QtGui.QListWidgetItem()

        self.MainWidget = QtGui.QWidget()

        self.CommandLine = QtGui.QLineEdit("")

        self.DeleteButton = QtGui.QPushButton()
        self.DeleteButton.setFixedSize(22, 22)
        self.DeleteButton.clicked.connect(Delete_OtherItem)

        self.ItemLayoutBox = QtGui.QHBoxLayout()

        self.ItemLayoutBox.addWidget(self.CommandLine)
        self.ItemLayoutBox.addWidget(self.DeleteButton)

        self.MainWidget.setLayout(self.ItemLayoutBox)

        self.Item.setSizeHint(self.MainWidget.sizeHint())

        OthersCommandList.addItem(self.Item)
        OthersCommandList.setItemWidget(self.Item, self.MainWidget)

AppWindow = QtGui.QMainWindow()
AppWindow.setWindowTitle("PoC ListWidget")
AppWindow.setFixedSize(550, 550)

TabWindow = QtGui.QTabWidget(AppWindow)
TabWindow.setGeometry(8, 30, 535, 505)

WorkTAB = QtGui.QWidget()
TabWindow.addTab(WorkTAB, 'Tab.01')

OthersCommandsWidget = QtGui.QListWidget(WorkTAB)
OthersCommandsWidget.setGeometry(QtCore.QRect(8, 40, 515, 430))

AddButton = QtGui.QPushButton(WorkTAB)
AddButton.setText("Add Item")
AddButton.setGeometry(QtCore.QRect(8, 8, 0, 0))
AddButton.setFixedSize(70, 22)

AddButton.clicked.connect(Add_OtherItem)

AppWindow.show()
sys.exit(app.exec_())

python python-3.x pyqt pyqt4 qlistwidget
1个回答
3
投票

您必须订购代码,最好的方法是使用类。在这种情况下,小部件(QLineEdit + QPushButton)必须是一个类,并通过属于该类的信号显示按钮的单击信号。

以同样的方式创建另一个类来处理QListWidget,获取任务使用几何的按钮行,在这种情况下我们将使用sender()获取小部件(sender()返回发出的对象)信号),然后使用mapToGlobal()相对于屏幕获取该小部件左上角的位置,使用mapFromGlobal()将全局位置转换为相对于QListWidget的viewport()的本地位置,然后使用本地位置,我们使用itemAt()获取项目,并使用项目任务很简单。

PyQt4:

import sys
from PyQt4 import QtGui, QtCore

class Widget(QtGui.QWidget):
    clicked = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        line_edit = QtGui.QLineEdit()
        delete_button = QtGui.QPushButton("Delete Row")
        hlay = QtGui.QHBoxLayout(self)
        hlay.addWidget(line_edit)
        hlay.addWidget(delete_button)
        delete_button.clicked.connect(self.clicked)

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("PoC ListWidget")

        tab_widget = QtGui.QTabWidget()
        work_tab = QtGui.QWidget()
        tab_widget.addTab(work_tab, 'Tab.01')

        self.others_commands_widget = QtGui.QListWidget()
        add_button = QtGui.QPushButton("Add")
        add_button.clicked.connect(self.add_other_command)

        vlay = QtGui.QVBoxLayout(work_tab)
        vlay.addWidget(add_button, alignment=QtCore.Qt.AlignLeft)
        vlay.addWidget(self.others_commands_widget)

        self.setCentralWidget(tab_widget)

    @QtCore.pyqtSlot()
    def add_other_command(self):
        it = QtGui.QListWidgetItem()
        self.others_commands_widget.addItem(it)
        widget = Widget()
        widget.clicked.connect(self.remove_other_command)
        self.others_commands_widget.setItemWidget(it, widget)
        it.setSizeHint(widget.sizeHint())

    @QtCore.pyqtSlot()
    def remove_other_command(self):
        widget = self.sender()
        gp = widget.mapToGlobal(QtCore.QPoint())
        lp = self.others_commands_widget.viewport().mapFromGlobal(gp)
        row = self.others_commands_widget.row(self.others_commands_widget.itemAt(lp))
        t_it = self.others_commands_widget.takeItem(row)
        del t_it


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

PyQt5:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
    clicked = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        line_edit = QtWidgets.QLineEdit()
        delete_button = QtWidgets.QPushButton("Delete Row")
        hlay = QtWidgets.QHBoxLayout(self)
        hlay.addWidget(line_edit)
        hlay.addWidget(delete_button)
        delete_button.clicked.connect(self.clicked)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("PoC ListWidget")

        tab_widget = QtWidgets.QTabWidget()
        work_tab = QtWidgets.QWidget()
        tab_widget.addTab(work_tab, 'Tab.01')

        self.others_commands_widget = QtWidgets.QListWidget()
        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(self.add_other_command)

        vlay = QtWidgets.QVBoxLayout(work_tab)
        vlay.addWidget(add_button, alignment=QtCore.Qt.AlignLeft)
        vlay.addWidget(self.others_commands_widget)

        self.setCentralWidget(tab_widget)

    @QtCore.pyqtSlot()
    def add_other_command(self):
        it = QtWidgets.QListWidgetItem()
        self.others_commands_widget.addItem(it)
        widget = Widget()
        widget.clicked.connect(self.remove_other_command)
        self.others_commands_widget.setItemWidget(it, widget)
        it.setSizeHint(widget.sizeHint())

    @QtCore.pyqtSlot()
    def remove_other_command(self):
        widget = self.sender()
        gp = widget.mapToGlobal(QtCore.QPoint())
        lp = self.others_commands_widget.viewport().mapFromGlobal(gp)
        row = self.others_commands_widget.row(self.others_commands_widget.itemAt(lp))
        t_it = self.others_commands_widget.takeItem(row)
        del t_it


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.