QListWidget拖拽会把itemwidget变不见
时间: 2023-12-08 19:06:41 浏览: 91
QListWidget的拖拽操作通常会导致item widget变得不可见,这是正常的行为。这是因为在拖拽操作中,QListWidget会将item widget从列表中移除,以便在拖拽过程中显示拖拽的项。当拖拽操作完成后,item widget会重新插入到列表中。
如果您希望在拖拽过程中仍然显示item widget,您可以使用setDragEnabled()方法将拖拽标志设置为False,这样就可以避免item widget在拖拽过程中不可见的问题。
另外,您还可以使用QListWidgetItem的setData()方法来存储任何与项相关的数据,以便在拖拽操作中进行传递和使用。这些数据可以在拖拽操作完成后使用,以更新列表中的条目。
相关问题
QListWidget 拖拽超出范围后 itemWidget就消失了
QListWidget 是一个非常常用的 Qt 控件,用于显示列表数据。当你在 QListWidget 中使用 itemWidget 时,可能会遇到拖拽超出范围后 itemWidget 消失的问题。
这个问题通常是由于 itemWidget 超出了 QListWidget 的边界而导致的。当你拖拽 itemWidget 离开 QListWidget 的边界时,itemWidget 就会消失。
为了解决这个问题,你可以通过将 itemWidget 的父对象设置为 QListWidget,这样当 itemWidget 超出 QListWidget 的边界时,它仍然会继续存在于 QListWidget 内部。
这里是一个示例代码:
```python
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem, QLabel, QHBoxLayout
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.q_list_widget = QListWidget()
self.q_list_widget.setDragEnabled(True)
self.q_list_widget.setAcceptDrops(True)
self.q_list_widget.viewport().setAcceptDrops(True)
for i in range(10):
item_widget = QWidget()
item_layout = QHBoxLayout()
item_label = QLabel(f"Item {i}")
item_layout.addWidget(item_label)
item_widget.setLayout(item_layout)
item = QListWidgetItem()
item.setSizeHint(item_widget.sizeHint())
self.q_list_widget.addItem(item)
self.q_list_widget.setItemWidget(item, item_widget)
item_widget.setParent(self.q_list_widget)
layout = QHBoxLayout()
layout.addWidget(self.q_list_widget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()
```
在这个示例代码中,我们创建了一个 QListWidget,并向其中添加了 10 个 itemWidget。我们将每个 itemWidget 的父对象设置为 QListWidget,并为其添加了一个 QLabel。
当你运行这个示例代码并拖拽 itemWidget 时,你会发现即使 itemWidget 超出 QListWidget 的边界,它仍然会保持在 QListWidget 内部。
QListWidget拖动item
要实现QListWidget中Item的拖拽,需要进行以下步骤:
1. 启用QListWidget的拖拽功能,可以通过在QListWidget对象上调用setDragEnabled(true)实现。
2. 重写QListWidget的dragEnterEvent和dragMoveEvent事件,以便检测拖动操作是否在QListWidget中被接受。您可以通过调用QDragEnterEvent和QDragMoveEvent对象的acceptProposedAction()方法来接受拖动操作并允许其继续。
3. 重写QListWidget的dropEvent事件,以便处理放置操作。在该函数中,您可以通过调用QDropEvent对象的mimeData()方法来检索QListWidget中被拖动的数据。一旦您获取了数据,就可以将其插入到QListWidget中,然后调用QDropEvent对象的accept()方法来接受放置操作。
下面是一个简单的示例代码:
```
void MyListWidget::startDrag(Qt::DropActions supportedActions)
{
QListWidgetItem *item = currentItem();
QMimeData *mimeData = new QMimeData;
mimeData->setData("text/plain", item->text().toUtf8());
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/images/drag.png"));
drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()/2));
if (drag->exec(Qt::MoveAction) == Qt::MoveAction) {
delete item;
}
}
void MyListWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("text/plain")) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->ignore();
}
}
void MyListWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("text/plain")) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->ignore();
}
}
void MyListWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("text/plain")) {
QByteArray data = event->mimeData()->data("text/plain");
QString text = QString::fromUtf8(data);
QListWidgetItem *newItem = new QListWidgetItem(text, this);
newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->ignore();
}
}
```
希望对您有所帮助!
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)