python - 单击其中的小部件 [子] 时如何选择 QListWidgetItem

标签 python python-3.x pyqt pyqt4 qlistwidget

我创建了一个 QListWidget...QListWidgetItem 由 QPushButton 和 QLineEdit 在 QHBoxLayout 内对齐组成...

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

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

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

我的问题:一旦点击删除按钮,如何才能选择 QListWidgetItem 条目...

enter image description here

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

最佳答案

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

以同样的方式创建另一个处理 QListWidget 的类,要获取按钮的行,任务是使用几何图形,在这种情况下,我们将使用 sender() 获取小部件(sender() 返回对象发出信号的),然后使用mapToGlobal()获得该小部件相对于屏幕的左上角位置,使用该全局位置转换为相对于QListWidget的viewport()的本地位置mapFromGlobal(),然后使用本地位置,我们使用 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_())

关于python - 单击其中的小部件 [子] 时如何选择 QListWidgetItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55491247/

相关文章:

python - 如何为散点图绘制平均线

python - 过滤字符串列表以不包含来自另一个列表的任何字符串作为子字符串

PyQt |不在 QThread 中处理但在主线程中处理的信号

PYTHON - 从一组多项选择中输出所有可能的结果?

python - 使用多列键 reshape Pandas 数据框

python - 修补在另一个函数中导​​入的函数

python - Brew 升级 python 返回 "python not installed"

python - 在连字符后跟数字之前使用正则表达式提取字符串的一部分

qt - 像过滤事件一样过滤 Qt 信号

python - 排序后 QTableWidget 的填充不完整