我创建了一个 QListWidget...QListWidgetItem 由 QPushButton 和 QLineEdit 在 QHBoxLayout 内对齐组成...
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_())
最佳答案
你必须订购你的代码,最好的方法是使用类。在这种情况下,小部件(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/