如何在 Qt 中使用自定义 titleBar 移动 window
How to move window using custom titleBar in Qt
我是 Qt 初学者,我想使用我自己的自定义 titleBar(QLabel) 进行拖动和移动Window。
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 上按下鼠标来移动 window,但我想通过在 QLabel 上按下鼠标来移动 window。
您可以重新实现 QLabel class 和 impalement 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);
}
}
我建议您使用 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;
}
上提出的问题的示例项目
我知道有点晚了,但我解决了这个问题。该代码与 Farhad 建议的实现非常相似,但要解决“跳跃”window,您还需要在事件过滤器中更新鼠标的当前位置:
if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = (QMouseEvent*)event;
if (pressed == false){
current = mouseEvent->pos();
}
pressed = true;
return true;
}
添加这个,当用户第一次按下 left-click 时,你会得到当前的鼠标位置。
完整的实现如下:
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);
我是 Qt 初学者,我想使用我自己的自定义 titleBar(QLabel) 进行拖动和移动Window。
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 上按下鼠标来移动 window,但我想通过在 QLabel 上按下鼠标来移动 window。
您可以重新实现 QLabel class 和 impalement 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);
}
}
我建议您使用 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;
}
上提出的问题的示例项目
我知道有点晚了,但我解决了这个问题。该代码与 Farhad 建议的实现非常相似,但要解决“跳跃”window,您还需要在事件过滤器中更新鼠标的当前位置:
if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = (QMouseEvent*)event;
if (pressed == false){
current = mouseEvent->pos();
}
pressed = true;
return true;
}
添加这个,当用户第一次按下 left-click 时,你会得到当前的鼠标位置。
完整的实现如下:
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);