大家在Qt开发中都用过这样的拖动操作,从左边拖动一个控件到右侧的窗口。或是在其它很多软件使用中,都有把图标通过拖动布置到主画面的操作。
如何实现呢?
先看看Qt帮助中的一个实例:
这个例子自定义了一个从QFrame继承的类DragWidget,然后实现了四个事件。
运行时,可以从一个widget中拖动图标的位置,也可以把图标拖动到另一个widget中。
其实,还可以在应用程序之间拖动。如下图:
可以把车子图标拖动到另一个应用程序中。
这是我自己测试的一个程序,要把图标放置到tablewidget中,而且图标位置要居中显示在落点位置最近的单元格中。
分析Qt实例代码:
再写一个DargWidget2,和DragWidget只是名字不一样,这样可以方便跟踪调试。
在主界面中,添加这两种控件。当在一个控件内部拖动图标时,调用的是它的drop函数。当拖动到另一个控件内时,调用的是另一个控件类的drop函数。
所以在wigdet2的drop函数中,对位置进行一下修正,就实现了目的。
void DragWidget5::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
QByteArray itemData = event->mimeData()->data("application/x-dnditemdata");
QDataStream dataStream(&itemData, QIODevice::ReadOnly)
QPixmap pixmap;
QPoint offset;
dataStream >> pixmap >> offset;
QLabel *newIcon = new QLabel(this);
newIcon->setPixmap(pixmap);
//计算位置
QTableWidgetItem * item = m_table->itemAt(event->pos());
if (item == NULL)
return;
int nRow = item->row();
int nColumn = item->column();
int x = nColumn * 80 + 40;
int y = -1;
if (nRow % 2 == 0)
{
y = (nRow + 1) * 50;
}
else
y = (nRow)* 50;
newIcon->move(QPoint(x,y));
newIcon->show();
newIcon->setAttribute(Qt::WA_DeleteOnClose);
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
}
else {
event->acceptProposedAction();
}
}
else {
event->ignore();
}
}
回到题目中的问题,如果要拖动树控件内容到主窗口的话,可以读取树控件节点的名字,然后找到对应的本地图标,拖放到右侧的时候,在drop函数中再加载图标即可。