【问题标题】:How to select a QListWidgetItem when click on a widget [child] inside it单击其中的小部件[子]时如何选择QListWidgetItem
【发布时间】:2019-08-24 18:02:48
【问题描述】:

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

QListWidgetItem 中的 QPushButton 链接到在单击 QListWidget 时应该从 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】:

    您必须订购代码,最好的方法是使用类。在这种情况下,小部件(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_())
    

    【讨论】:

    • self.BrowseBtn.clicked.connect(self.browse_files) TypeError: connect() failed between clicked(bool) and browse_files()
    • 不起作用。连接按钮添加项目的功能有错误
    • 你的代码可以自己运行..我的代码在stackoverflow.com/questions/55546037/…..请看一下
    • 我已经编辑了我的代码..我将编辑这个问题..你可以过一会儿看看
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2023-03-25
    • 2021-01-08
    • 2019-11-02
    相关资源
    最近更新 更多