)
目录1.Q_UNUSED(event);1.1 先看一个例子1.2 为什么需要这样写1.3 Q_UNUSED(event) 和 event 有什么区别1.4 Qt 中什么时候使用它2.move、globalpos、pos2.1 先认识两种坐标2.2 globalPos()获取鼠标在屏幕上的位置2.3 pos()获取窗口的位置2.4 move()把窗口移动到指定位置2.5 三个函数如何配合实现拖动阶段 1鼠标按下时记录偏移量阶段 2鼠标移动时计算窗口的新位置2.6 最后用一句话区分它们1.Q_UNUSED(event);Q_UNUSED(event);是 Qt 中的一个宏作用是告诉编译器这个变量虽然没有被使用但是这是我有意为之不是忘记使用它。在学习 Qt 的时候经常会在事件函数中看到它例如paintEvent()、mousePressEvent()等。1.1 先看一个例子void Widget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); painter.drawEllipse(50, 50, 100, 100); }这里的event是一个指针指向绘制事件的信息。但是这段代码只需要绘制一个圆并没有用到event里面的信息。因此可以写Q_UNUSED(event);表示我知道event存在但当前不需要使用它。1.2 为什么需要这样写假设你定义了一个函数void test(int a) { cout Hello endl; }函数接收了参数a但是从头到尾都没有使用它。编译器可能会给出类似这样的警告warning: unused parameter a这不是错误程序通常仍然可以运行只是编译器提醒你这个参数没有被使用。如果你明确知道这个参数暂时不需要就可以写void test(int a) { Q_UNUSED(a); cout Hello endl; }这样就能避免针对这个参数的未使用警告。1.3Q_UNUSED(event)和event有什么区别写法含义Q_UNUSED(event);声明当前不需要使用这个变量event-...通过指针访问事件对象的成员Q_UNUSED(event);不写也可以正常运行但可能出现未使用参数警告注意Q_UNUSED(event)不会删除变量也不会让事件失效更不会改变事件本身的内容。1.4 Qt 中什么时候使用它例如Qt 自动生成的事件函数可能是void Widget::mousePressEvent(QMouseEvent *event) { Q_UNUSED(event); }如果你暂时不需要判断鼠标点击的位置或按键就可以这样写。等到以后需要获取鼠标位置时void Widget::mousePressEvent(QMouseEvent *event) { QPoint pos event-pos(); qDebug() pos; }此时已经使用了event就不再需要写Q_UNUSED(event);了。2.move、globalpos、pos我们把这三个函数放在一起理解。它们是 Qt 无边框窗口拖动中最重要的三个概念move()移动窗口。globalPosition()你说的globalPos()获取鼠标在屏幕上的位置。pos()获取窗口自身的位置。我用一个具体的例子带你理解。2.1 先认识两种坐标假设你的 Qt 音乐播放器窗口显示在电脑屏幕上。这里要分清楚全局坐标以整个屏幕为参照。窗口位置窗口左上角相对于屏幕的位置。对于普通顶层 QWidget 窗口这两个位置都使用屏幕坐标系。2.2globalPos()获取鼠标在屏幕上的位置在 Qt 5 中你可能看到event-globalPos();它返回一个QPoint表示鼠标在屏幕上的坐标。例如QPoint mousePos event-globalPos();假设鼠标在屏幕上的位置是(140, 110)那么mousePos.x(); // 140 mousePos.y(); // 110如果你使用的是 Qt 6推荐使用event-globalPosition().toPoint();两者的目的相同都是获取鼠标的全局位置Qt 6 的globalPosition()返回的是QPointF通过toPoint()转换为整数坐标QPoint。记忆方法global就是全局globalPos就是鼠标在屏幕上的位置。2.3pos()获取窗口的位置例如QPoint windowPos pos();这里的pos()是QWidget的成员函数返回当前窗口的位置。假设窗口左上角位于屏幕坐标(100, 80)那么pos().x(); // 100 pos().y(); // 80注意这里说的是窗口的位置不是鼠标的位置也不是窗口的宽度和高度。例如QPoint p pos();p保存的是窗口的位置而不是窗口的尺寸。如果想获取窗口的宽度和高度可以使用width(); height();2.4move()把窗口移动到指定位置例如move(200, 150);表示把窗口移动到新的位置(200, 150)。也可以写成move(QPoint(200, 150));这两种写法效果相同。需要注意move()不会自动帮你计算鼠标与窗口之间的距离。你传入什么位置它就尝试将窗口移动到那个位置。2.5 三个函数如何配合实现拖动这是最重要的部分。我们把它拆成两个阶段。阶段 1鼠标按下时记录偏移量movePoint event-globalPosition().toPoint() - pos();假设鼠标的屏幕坐标是(140, 110)。窗口左上角的坐标是(100, 80)。计算所以movePoint QPoint(40, 30);它表示鼠标按下的位置距离窗口左上角水平 40、垂直 30 个坐标单位。阶段 2鼠标移动时计算窗口的新位置QPoint mousePos event-globalPosition().toPoint(); move(mousePos - movePoint);假设鼠标拖到了屏幕坐标(240, 210)。计算然后执行move(200, 180);窗口左上角就会移动到(200, 180)。2.6 最后用一句话区分它们函数你可以把它理解为event-globalPos()鼠标现在在屏幕哪里Qt 5pos()窗口现在在屏幕哪里move(x, y)把窗口移动到哪里Qt 6 中对应的鼠标位置写法是event-globalPosition().toPoint()。