本程序实现了,可以关闭一个窗口,还可以拖着窗口到处跑的功能。
一、mydialog.h的程序:
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QtWidgets/QMainWindow>
#include "ui_mydialog.h"
#include <QMouseEvent> //引用鼠标类头文件
#include <QPushButton> //引用按钮类头文件
class mydialog : public QMainWindow
{
Q_OBJECT
public:
mydialog(QWidget *parent = 0);
~mydialog();
//定义鼠标三种状态方法
protected:
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);
void mouseReleaseEvent(QMouseEvent* e);
private:
Ui::mydialogClass ui;
//定义 QPoint 对象
QPushButton* btClose;
QPoint last;
};
#endif // MYDIALOG_H
二、mydialog.cpp的程序部分:
#include "mydialog.h"
mydialog::mydialog(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);//this是一个程序窗口的实例
//标题名
this->setWindowTitle("moving no-bord window");
//去掉标题栏
this->setWindowFlags(Qt::FramelessWindowHint);
//实例化一个按钮控件,因为去掉标题栏后,窗体没有关闭按钮了。
//所以自己添加一个按钮实现关闭功能。
btClose = new QPushButton(this);
btClose->setText("close");
//按钮点击事件
connect(btClose, SIGNAL(clicked()), this, SLOT(close()));
}
mydialog::~mydialog()
{
}
//获取鼠标点定位窗体位置
void mydialog::mousePressEvent(QMouseEvent* e)
{
last = e->globalPos();
}
void mydialog::mouseMoveEvent(QMouseEvent* e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
last = e->globalPos();
move(x() + dx, y() + dy);
}
void mydialog::mouseReleaseEvent(QMouseEvent* e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
move(x()+dx,y()+dy);
}
程序运行结果如下:
若只去除最大化和最小化按钮,则只须变化程序如下:
//关闭按钮失效
//this->setWindowFlags(Qt::WindowMinMaxButtonsHint);
//去掉最大化、最小化按钮,保留关闭按钮
this->setWindowFlags(Qt::WindowCloseButtonHint);
运行结果如下: