Qt学习二:移动无边框窗体

本程序实现了,可以关闭一个窗口,还可以拖着窗口到处跑的功能。

一、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);

运行结果如下:





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值