Qt-控制阻力特性

Qt-控制阻力特性,qt,drag-and-drop,Qt,Drag And Drop,假设我希望我的可拖动小部件的移动方式与拖动时停留在光标下的移动方式不同。例如,让小部件仅在一个轴上移动,或者让小部件移动光标和拖动起点之间的两倍距离。我应该覆盖哪种方法来定义这种行为?对于小部件,这四种方法控制被拖动小部件的行为: virtual void dragEnterEvent ( QDragEnterEvent * event ) virtual void dragLeaveEvent ( QDragLeaveEvent * event ) virtual void dragMoveE

假设我希望我的可拖动小部件的移动方式与拖动时停留在光标下的移动方式不同。例如,让小部件仅在一个轴上移动,或者让小部件移动光标和拖动起点之间的两倍距离。我应该覆盖哪种方法来定义这种行为?

对于小部件,这四种方法控制被拖动小部件的行为:

virtual void dragEnterEvent ( QDragEnterEvent * event )
virtual void dragLeaveEvent ( QDragLeaveEvent * event )
virtual void dragMoveEvent ( QDragMoveEvent * event )
virtual void dropEvent ( QDropEvent * event )

我想你必须重新实现dragMoveEvent来实现你想要的。

我想你应该问自己一个问题:你有一些我想要拖动到特定目标的可拖动元素吗(例如,您有代表不同形状的小部件,这些小部件应该拖到代表孔的其他小部件上,每个“孔”只接受相同形状的部件)或者您只是想将一个小部件移到另一个小部件上吗

如果您需要拖放功能,在我看来,您无法真正更改鼠标移动过程中的行为-它或多或少是硬编码到QDrag对象中的

如果您只是想四处移动东西,您应该只需要重新实现鼠标移动/按下/释放事件(您可能还需要通过QWidget::setMouseTracking方法启用鼠标跟踪)

编辑:

这是“只是移动东西”的可拖动标签的示例代码:

#如果没有可拖动标签#
#定义DragableLabel_H
#包括
#包括
#包括
类DragTableLabel:公共QLabel
{
Q_对象
公众:
显式DraggableLabel(const-QString&text,QWidget*parent=0):QLabel(text,parent){}
受保护的:
作废鼠标压力事件(QMouseEvent*事件){
dragStart=事件->位置();
}
作废mouseMoveEvent(QMouseEvent*事件){
setGeometry(QRect(geometry().topLeft()+事件->位置()-dragStart,rect().size());
}
私人:
QPoint dragStart;
};
#endif//DRAGGABLELABEL\u H
现在,您只需将其添加到主窗口小部件:

#include <QApplication>
#include <QWidget>

#include "draggablelabel.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;

    DraggableLabel *label = new DraggableLabel("Test", &mainWindow);

    mainWindow.setMinimumSize(200, 200);
    mainWindow.show();

    return a.exec();
}
#包括
#包括
#包括“DragableLabel.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QWidget主窗口;
DragTableLabel*label=新的DragTableLabel(“测试”和主窗口);
主窗口。设置最小大小(200200);
mainWindow.show();
返回a.exec();
}

您可以尝试使用moveMouseEvent来实现仅在一个轴上的拖动。

您在拖动什么以及它在哪种类型的小部件上被拖动?这不仅仅是一个理论问题吗?我想控制在QWidget中绘制的几个可拖动QLabel的行为。我正在使用的应用程序基于冰箱磁铁Qt SDK附带的示例。在dragMoveEvent()中是否有我必须执行的控制小部件行为的示例?我试图通过在Dragable小部件的mouseMoveEvent()中更改QDrag的hotspot属性来搞乱拖放机器人示例,但它只是在拖动开始时才被调用,所以还不够好。我认为移动东西就是拖放。那么,有可能让小部件只在一个轴上移动吗?如果我有几列可拖动的小部件,当拖动其中一列时,我希望它的移动限制在它自己的列上。可以吗完成了吗?+1谢谢@chalup,这正是我想要的!:)
#include <QApplication>
#include <QWidget>

#include "draggablelabel.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;

    DraggableLabel *label = new DraggableLabel("Test", &mainWindow);

    mainWindow.setMinimumSize(200, 200);
    mainWindow.show();

    return a.exec();
}