PyQt5 QListWidget 删除鼠标悬停QListItem
PyQt5 QListWidget delete mouse hover QListItem
我遇到了 PyQt5 Qlistwidget 问题。下面是我当前的代码:
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
class FlatUIListWidget(QtWidgets.QListWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setStyleSheet("""
QScrollBar:vertical {
border: none;
background:white;
width:3px;
margin: 0px 0px 0px 0px;
}
QScrollBar::handle:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
min-height: 0px;
}
QScrollBar::add-line:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
height: 0px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
height: 0 px;
subcontrol-position: top;
subcontrol-origin: margin;
}
""")
def add_custom_widget(self, widget):
myQListWidgetItem = QtWidgets.QListWidgetItem(self)
# Set size hint
myQListWidgetItem.setSizeHint(widget.sizeHint())
# Add QListWidgetItem into QListWidget
self.addItem(myQListWidgetItem)
self.setItemWidget(myQListWidgetItem, widget)
class DummyWidget(QtWidgets.QWidget):
delete_signal = QtCore.pyqtSignal(str)
def __init__(self, text):
super().__init__()
self.text = text
self.layout = QtWidgets.QVBoxLayout(self)
self.delete_button = QtWidgets.QPushButton(text)
self.delete_button.clicked.connect(self.on_delte_button_clicked)
self.layout.addWidget(self.delete_button)
def on_delte_button_clicked(self):
self.delete_signal.emit(self.text)
class Container(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.layout = QtWidgets.QVBoxLayout(self)
self.list_widget = FlatUIListWidget()
self.layout.addWidget(self.list_widget)
for i in range(10):
self.add_widget(str(i))
def add_widget(self, text):
item = DummyWidget(text)
item.delete_signal.connect(self.on_item_delete)
self.list_widget.add_custom_widget(item)
def on_item_delete(self, string):
try:
# cursor = QtGui.QCursor()
# print(cursor.pos())
# print(self.list_widget.itemAt(cursor.pos()))
# print(self.list_widget.selectedItems())
# print(self.sender().parent().parent())
# print(self.list_widget.currentRow())
# self.list_widget.setCurrentItem(self.sender().parent())
# self.list_widget.takeItem(self.sender().parent())
print(string)
self.list_widget.takeItem(self.list_widget.currentRow())
except Exception as e:
print(e)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mw = Container()
mw.show()
sys.exit(app.exec_())
基本上,我想创建一个包含所有自定义项目的 QListWidget
。在这些项目中的每一个中,都有一个允许用户删除自身的按钮。我尝试了以下方法:
将按钮点击信号连接到 self.sender().deleteLater()
。这不起作用,因为它只会删除 QListWidgetItem
内的小部件,并会在 QListWidget
.
中留下一个空白框
点击按钮后,向Container
小部件发出信号并删除当前行。这也不起作用,因为您实际上需要先在小部件上 select 然后单击删除,否则它会删除第一行。
给每个项目小部件一个名称标签,然后单击按钮,循环遍历列表小部件并使用 takeItem()
删除具有相同标签的小部件。我只是觉得这种做法不够优雅...
我认为如果我能以某种方式获取已单击按钮的小部件的行号并在 self.list_widget.row(row_number)
上使用 takeItem()
删除,这将是最有意义的。我只是想不通怎么办。
我看了QListWidget
和QListWidgetItems
的官方文档,都没有给我答案。如果有人能提供一些想法,我将不胜感激。
将自定义小部件添加到 QListWidget
是从此 post 重写的:PyQt QListWidget custom items
使用QWidget
消除项目的过程如下:
获取widget相对于viewport()
的位置,本例很容易,因为widget(DummyWidget
)是children viewport()
, 所以我们应该只使用 self.sender().pos()
.
利用位置我们通过itemAt()
.
获取item
使用项目我们通过 row()
.
获取行
然后我们用takeItem()
消除它。
实现如下:
def on_item_delete(self, string):
it = self.list_widget.itemAt(self.sender().pos())
row = self.list_widget.row(it)
item = self.list_widget.takeItem(row)
del item
我遇到了 PyQt5 Qlistwidget 问题。下面是我当前的代码:
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
class FlatUIListWidget(QtWidgets.QListWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setStyleSheet("""
QScrollBar:vertical {
border: none;
background:white;
width:3px;
margin: 0px 0px 0px 0px;
}
QScrollBar::handle:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
min-height: 0px;
}
QScrollBar::add-line:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
height: 0px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical {
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop: 0 rgb(32, 47, 130), stop: 0.5 rgb(32, 47, 130), stop:1 rgb(32, 47, 130));
height: 0 px;
subcontrol-position: top;
subcontrol-origin: margin;
}
""")
def add_custom_widget(self, widget):
myQListWidgetItem = QtWidgets.QListWidgetItem(self)
# Set size hint
myQListWidgetItem.setSizeHint(widget.sizeHint())
# Add QListWidgetItem into QListWidget
self.addItem(myQListWidgetItem)
self.setItemWidget(myQListWidgetItem, widget)
class DummyWidget(QtWidgets.QWidget):
delete_signal = QtCore.pyqtSignal(str)
def __init__(self, text):
super().__init__()
self.text = text
self.layout = QtWidgets.QVBoxLayout(self)
self.delete_button = QtWidgets.QPushButton(text)
self.delete_button.clicked.connect(self.on_delte_button_clicked)
self.layout.addWidget(self.delete_button)
def on_delte_button_clicked(self):
self.delete_signal.emit(self.text)
class Container(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.layout = QtWidgets.QVBoxLayout(self)
self.list_widget = FlatUIListWidget()
self.layout.addWidget(self.list_widget)
for i in range(10):
self.add_widget(str(i))
def add_widget(self, text):
item = DummyWidget(text)
item.delete_signal.connect(self.on_item_delete)
self.list_widget.add_custom_widget(item)
def on_item_delete(self, string):
try:
# cursor = QtGui.QCursor()
# print(cursor.pos())
# print(self.list_widget.itemAt(cursor.pos()))
# print(self.list_widget.selectedItems())
# print(self.sender().parent().parent())
# print(self.list_widget.currentRow())
# self.list_widget.setCurrentItem(self.sender().parent())
# self.list_widget.takeItem(self.sender().parent())
print(string)
self.list_widget.takeItem(self.list_widget.currentRow())
except Exception as e:
print(e)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mw = Container()
mw.show()
sys.exit(app.exec_())
基本上,我想创建一个包含所有自定义项目的 QListWidget
。在这些项目中的每一个中,都有一个允许用户删除自身的按钮。我尝试了以下方法:
将按钮点击信号连接到
self.sender().deleteLater()
。这不起作用,因为它只会删除QListWidgetItem
内的小部件,并会在QListWidget
. 中留下一个空白框
点击按钮后,向
Container
小部件发出信号并删除当前行。这也不起作用,因为您实际上需要先在小部件上 select 然后单击删除,否则它会删除第一行。给每个项目小部件一个名称标签,然后单击按钮,循环遍历列表小部件并使用
takeItem()
删除具有相同标签的小部件。我只是觉得这种做法不够优雅...
我认为如果我能以某种方式获取已单击按钮的小部件的行号并在 self.list_widget.row(row_number)
上使用 takeItem()
删除,这将是最有意义的。我只是想不通怎么办。
我看了QListWidget
和QListWidgetItems
的官方文档,都没有给我答案。如果有人能提供一些想法,我将不胜感激。
将自定义小部件添加到 QListWidget
是从此 post 重写的:PyQt QListWidget custom items
使用QWidget
消除项目的过程如下:
获取widget相对于
viewport()
的位置,本例很容易,因为widget(DummyWidget
)是childrenviewport()
, 所以我们应该只使用self.sender().pos()
.利用位置我们通过
itemAt()
. 获取item
使用项目我们通过
row()
. 获取行
然后我们用
takeItem()
消除它。
实现如下:
def on_item_delete(self, string):
it = self.list_widget.itemAt(self.sender().pos())
row = self.list_widget.row(it)
item = self.list_widget.takeItem(row)
del item