我是 Qt 初学者,我想使用我自己的自定义 titleBar(QLabel) 拖动和移动窗口。
Qt代码:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
mpos = event->pos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint diff = event->pos() - mpos;
QPoint newpos = this->pos() + diff;
this->move(newpos);
}
}
此代码允许我通过在任何 QWidget 上按下鼠标来移动窗口,但我想通过在 QLabel 上按下鼠标来移动窗口。
我知道有点晚了,但我解决了这个问题。该代码与 Farhad 建议的实现非常相似,但是要解决“跳跃”窗口,您还需要在事件过滤器中更新鼠标的当前位置:
if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = (QMouseEvent*)event;
if (pressed == false){
current = mouseEvent->pos();
}
pressed = true;
return true;
}
添加此功能,当用户第一次按左键单击时,您可以获得当前鼠标位置。
这是完整的实现:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
current = event->pos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(pressed)
this->move(mapToParent(event->pos() - current));
}
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = (QMouseEvent*)event;
if (pressed == false){
current = mouseEvent->pos();
}
pressed = true;
return true;
}
if (object == ui->frame_title && event->type() == QEvent::MouseButtonRelease)
{
pressed = false;
return true;
}
else
return false;
}
然后在你的构造函数中,只需添加(frame_title 是我的标题栏):
ui->frame_title->installEventFilter(this);
我建议您使用
eventFilter
来获取事件 MousePress
和 MouseRelease
:
void MainApp::mousePressEvent(QMouseEvent *event)
{
current = event->pos();
}
void MainApp::mouseMoveEvent(QMouseEvent *event)
{
if(pressed)
this->move(mapToParent(event->pos() - current));
}
bool MainApp::eventFilter(QObject *object, QEvent *event)
{
if (object == ui->label && event->type() == QEvent::MouseButtonPress)
{
pressed = true;
return true;
}
if (object == ui->label && event->type() == QEvent::MouseButtonRelease)
{
pressed = false;
return true;
}
else
return false;
}
这是针对您问题的示例项目,请在 github 上下载。
您可以重新实现QLabel类并刺穿
mousePressEvent
示例:
头文件
#ifndef MYLABLE_H
#define MYLABLE_H
#include <QEvent>
#include <QObject>
#include <QLabel>
class MyLable : public QLabel
{
Q_OBJECT
public:
explicit MyLable(QWidget *parent = 0);
QPoint mpos;
signals:
public slots:
// QWidget interface
protected:
void mousePressEvent(QMouseEvent *);
};
#endif // MYLABLE_H
.cpp
#include "mylable.h"
#include <QMouseEvent>
MyLable::MyLable(QWidget *parent) : QLabel(parent)
{
}
void MyLable::mousePressEvent(QMouseEvent * event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint diff = event->pos() - mpos;
QPoint newpos = this->pos() + diff;
this-> parentWidget()->move(newpos);
}
}
这是事件过滤器建议的稍微修改版本,而不是使用
QMouseEvent::globalPos()
:
void MainWindow::mousePressEvent(QMouseEvent* event)
{
mousePos_ = event->globalPos();
}
void MainWindow::mouseMoveEvent(QMouseEvent* event)
{
if (!event->buttons().testFlag(Qt::LeftButton))
return;
if(moveWindow_)
{
move(geometry().topLeft() + event->globalPos() - mousePos_);
mousePos_ = event->globalPos();
}
}
bool MainWindow::eventFilter(QObject* object, QEvent* event)
{
if (object == logo_ &&
event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent{ static_cast<QMouseEvent*>(event) };
if (mouseEvent->buttons().testFlag(Qt::LeftButton))
{
mousePos_ = mouseEvent->globalPos();
moveWindow_ = true;
return true;
}
else
{
return false;
}
}
if (object == logo_ && event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent* mouseEvent{ static_cast<QMouseEvent*>(event) };
if (mouseEvent->buttons().testFlag(Qt::LeftButton))
{
moveWindow_ = false;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}