目录
说明
效果展示
代码
说明
在使用了自定义的标题栏,想要实现鼠标只能在标题栏中拖动窗口,在其它地方拖动不了窗口的效果。
我们这里是在标题栏类的鼠标事件中处理拖动窗口的事情。
实现过程:标题栏类中的鼠标事件获取了拖动位置后,通过移动标题栏的父类部件,从而实现窗口拖动。
效果展示
代码
主窗口代码
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QLayout>
#include "my_title_bar.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//标题栏
MyTitleBar* title_bar = new MyTitleBar(this);
//设置背景色
title_bar->setStyleSheet("MyTitleBar{background-color: gray;}");
//设置窗口属性和布局
this->setWindowFlags(Qt::FramelessWindowHint);//去除标题栏
QVBoxLayout* main_vlayout = new QVBoxLayout(this);
this->setLayout(main_vlayout);
main_vlayout->setMargin(0);
main_vlayout->setSpacing(0);
main_vlayout->addWidget(title_bar, 1);
main_vlayout->addStretch(9);
}
Widget::~Widget()
{
delete ui;
}
标题栏代码
#ifndef MYTITLEBAR_H
#define MYTITLEBAR_H
#include <QLabel>
#include <QMouseEvent>
class MyTitleBar : public QLabel
{
Q_OBJECT
public:
explicit MyTitleBar(QWidget *parent = 0)
: QLabel(parent)
{
}
protected:
void mousePressEvent(QMouseEvent* ev) override
{
QWidget* parent_widget = this->parentWidget();
start_move_pos_ = ev->globalPos() - parent_widget ->frameGeometry().topLeft();
}
void mouseMoveEvent(QMouseEvent* ev) override
{
//移动父部件位置
QWidget* parent_widget = this->parentWidget();
parentWidget->move(parent_widget->mapToGlobal(ev->pos() - start_move_pos_));
}
private:
QPoint start_move_pos_;
};
#endif // MYTITLEBAR_H