我必须制作类似iOS界面的东西,可以拖动3x3图标字段来改变它们的位置,然后在XML文件中记住它。
我决定使用Grid类(QWidget是父类)作为容器和我自己的类,继承自QWidget,作为元素。
现在我正在努力学习如何执行拖拽和放大为QWidget丢弃,但看起来你只能放到QWidget上,但是无法拖动它。
这不可能吗?我怎么搬这个东西?
答案 0 :(得分:4)
拖动小部件并不容易。你必须自己做很多编码。
来自Qt Docs:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
drag->setMimeData(mimeData);
drag->setPixmap(iconPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
这意味着,当您的窗口小部件收到要拖动它的消息时,例如与使用mousepress一样,它必须创建一个QDrag对象。
在QDrag对象中,您可以设置一个像素图,它代表您拖动的小部件。如果此时隐藏了窗口小部件,则看起来好像鼠标指针“占用”了窗口小部件。
此外,您还需要一个QMimeData对象。在此,您可以放置描述窗口小部件的各种数据。在您的用例中,您可以识别您的小部件。因为,这里有困难的部分:你必须自己动手。
小部件是网格的父节点,它接收drop事件并从mime数据中读取,哪个小部件希望我移动。从QDropEvent中获取移动小部件的点。这就是你需要编码的东西:网格布局中的实际重新定位。并且不要忘记更新xml。
答案 1 :(得分:3)
做一个技巧,然后你也可以拖动QWidget,
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap
现在使用此widgetPixmap
作为yourDragObject->setPixmap();
例如,
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap);
drag->setMimeData(mimeData);
drag->setPixmap(widgetPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
答案 2 :(得分:0)
Qt wiki包含一个关于如何使用少于80行代码模拟iOS图标界面的QtQuick示例。
你可以找到它here。