QListWidget怎么限制只能在当前控件拖放?
时间: 2024-03-27 11:14:30 浏览: 165
要限制QListWidget只能在当前控件拖放,可以在QListWidget的dragEnterEvent和dragMoveEvent事件中设置QDropEvent的acceptProposedAction方法为True,如下所示:
```python
class MyListWidget(QtWidgets.QListWidget):
def __init__(self, parent=None):
super(MyListWidget, self).__init__(parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat('text/plain'):
event.acceptProposedAction()
def dragMoveEvent(self, event):
if event.mimeData().hasFormat('text/plain'):
event.acceptProposedAction()
```
这样就可以限制只能在当前控件拖放了。
相关问题
QListWidgetItem怎么能不在其他控件上拖放?
要实现QListWidgetItem不在其他控件上拖放,可以通过重写QListWidgetItem中的mimeData函数来实现。具体步骤如下:
1. 继承QListWidgetItem,重写mimeData函数,返回一个空的QMimeData对象。
```python
class MyListWidgetItem(QListWidgetItem):
def mimeData(self, *args, **kwargs):
return QMimeData()
```
2. 在拖放开始时,判断当前拖放的项是否为MyListWidgetItem类型的,是则启用拖放,否则禁用拖放。
```python
class MyListWidget(QListWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
event.accept()
return
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
event.setDropAction(Qt.MoveAction)
event.accept()
return
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
data = event.mimeData().data('application/x-qabstractitemmodeldatalist')
stream = QDataStream(data, QIODevice.ReadOnly)
rows = []
while not stream.atEnd():
row, col, _ = stream.readInt32(), stream.readInt32(), stream.readInt32()
rows.append(row)
rows = sorted(set(rows))
for row in reversed(rows):
self.takeItem(row)
event.setDropAction(Qt.MoveAction)
event.accept()
return
event.ignore()
```
这样就可以实现QListWidgetItem不在其他控件上拖放的效果了。
QT QLIstWidget实现内部控件能够拖拽移动顺序
在Qt中,如果你想实现在QListWidget内的项目之间进行拖放(Drag and Drop)以便调整它们的顺序,你可以利用内置的`QDropEvent`和`QDragMoveEvent`信号槽机制。以下是基本步骤:
1. 首先,你需要给QListWidget的每个item添加`draggable`属性,并提供`dragEnterEvent()`, `dragMoveEvent()`, 和 `dropEvent()` 方法,这些方法会在相应事件发生时被调用:
```cpp
class MyListWidgetItem : public QListWidgetItem {
public:
MyListWidgetItem(const QString &text) : QListWidgetItem(text) {
setFlags(setFlags() | Qt::ItemIsDragEnabled); // 设置可拖动
}
void dragEnterEvent(QDragEnterEvent *event) override {
if (event->mimeData()->hasFormat("application/x-item")) {
event->acceptProposedAction();
} else {
event->ignore();
}
}
void dragMoveEvent(QDragMoveEvent *event) override {
event->acceptProposedAction();
}
void dropEvent(QDropEvent *event) override {
int sourceIndex = index(); // 当前item在列表中的位置
int targetIndex = event->source().index(); // 拖动源的位置
move(targetIndex, sourceIndex); // 移动item到新位置
emit itemMoved(sourceIndex, targetIndex); // 触发自定义信号
event->accept();
}
};
```
2. 然后,在主窗口或者容器类中,监听`itemMoved`信号并更新视图或数据模型:
```cpp
connect(yourListWidget, &MyListWidget::itemMoved, this, [yourListWidget](int oldIndex, int newIndex) {
yourListWidget->takeItem(oldIndex);
yourListWidget->insertItem(newIndex, yourListWidget->takeItem(newIndex)); // 更新列表内容
});
```
3. 创建一个简单的拖放动作,例如通过`QDrag`和`QMimeData`来传输item的数据:
```cpp
QDrag *drag = new QDrag(parent);
QMimeData *data = new QMimeData();
data->setText(item->text()); // 或者包含更多数据,如item索引等
drag->setMimeData(data);
drag->start(Qt::CopyAction);
```
阅读全文