QT实现无边框窗体的最小化,最大化/还原,关闭,拖动和双击最大化等功能
2017-07-20 20:12
1851 查看
在窗体没有标题栏属性的情况下,窗体的最小化,最大化/还原,关闭,拖动和双击最大化等功能需要自定义。
本例介绍如何实现化,最大化/还原,关闭,拖动和双击最大化等功能,目前只是一个简单的Demo,后期将会在此Demo的基础上加上窗体的拉伸,再后期将会加上美化界面的代码。凡是复杂的功能都是由简单的功能发展而来的。
刚开始写博客,再加上时间都是挤压出来,自然是不会有很精美的排版,既然精美不了,那就简洁吧。
本例的知识点涉及了按钮的创建,布局,信号与槽,主要还是重写以下几个事件:
源码: widget.h
源码: widget.cpp
窗体界面如下:
案例源码以上传到:http://download.csdn.net/detail/qq_33218979/9905608
本例介绍如何实现化,最大化/还原,关闭,拖动和双击最大化等功能,目前只是一个简单的Demo,后期将会在此Demo的基础上加上窗体的拉伸,再后期将会加上美化界面的代码。凡是复杂的功能都是由简单的功能发展而来的。
刚开始写博客,再加上时间都是挤压出来,自然是不会有很精美的排版,既然精美不了,那就简洁吧。
本例的知识点涉及了按钮的创建,布局,信号与槽,主要还是重写以下几个事件:
void mousePressEvent(QMouseEvent*event);
void mouseMoveEvent(QMouseEvent*event);
void mouseReleaseEvent(QMouseEvent*event);
void mouseDoubleClickEvent(QMouseEvent*event);
源码: widget.h
/*
* @author: landspace
* @date: 2017-7-20 19:05:59
* @version: 1.0
* @brief: To achieve the borderless form to minimize, maximize, restore, close, drag and other functions
*
**/
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QDesktopWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget*parent = 0);
~Widget();
private:
Ui::Widget*ui;
QPushButton*m_closeBtn;
QPushButton*m_normalBtn;
QPushButton*m_minBtn;
QPoint m_mousePos;
QPoint m_windowPos;
QRect clientRect;
QDesktopWidget* desktop;
QRect*rect;
int lengthToMouse;
double ratio; // 比例
bool isMaxWindow;
bool m_mousePressed;
protected:
void mousePressEvent(QMouseEvent*event);
void mouseMoveEvent(QMouseEvent*event);
void mouseReleaseEvent(QMouseEvent*event);
void mouseDoubleClickEvent(QMouseEvent*event);
void updateNormalBtn();
public slots:
void maxRestoreSlot();
};
#endif // WIDGET_H
源码: widget.cpp
/*
* @author: landspace
* @date: 2017-7-20 19:05:59
* @version: 1.0
* @brief: To achieve the borderless form to minimize, maximize, restore, close, drag and other functions
*
**/
#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
Widget::Widget(QWidget*parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setMinimumSize(800,600);
setWindowFlag(Qt::FramelessWindowHint); // 隐藏标题栏
isMaxWindow = false;
clientRect = QApplication::desktop()->availableGeometry(); //用户可用窗口大小
rect = new QRect(0, 0, clientRect.width(), 30); // 鼠标点击的有效区域
m_minBtn = new QPushButton(tr("最小化"),this);
m_normalBtn = new QPushButton(tr("最大化"),this);
m_closeBtn = new QPushButton(tr("关闭"),this);
// 布局(把按钮布局到右上角)
QHBoxLayout*hbLayout = new QHBoxLayout();
hbLayout->addStretch();
hbLayout->addWidget(m_minBtn);
hbLayout->addWidget(m_normalBtn);
hbLayout->addWidget(m_closeBtn);
QVBoxLayout*vbLayout = new QVBoxLayout(this);
vbLayout->addLayout(hbLayout);
vbLayout->addStretch();
connect(m_minBtn,&QPushButton::clicked,this,&Widget::showMinimized);
connect(m_normalBtn,&QPushButton::clicked,this,&Widget::maxRestoreSlot);
connect(m_closeBtn,&QPushButton::clicked,this,&Widget::close);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mouseDoubleClickEvent(QMouseEvent*event)
{
// this->isMaximized() ? this->showNormal() : this->showMaximized();
if(rect->contains(this->mapFromGlobal(QCursor::pos())) == true) // 指定区域内
maxRestoreSlot();
}
void Widget::mousePressEvent(QMouseEvent*event)
{
if(rect->contains(this->mapFromGlobal(QCursor::pos())) == true){ // 指定区域内
if(event->button() == Qt::LeftButton){
m_windowPos = this->pos();
m_mousePos = event->globalPos();
this->m_mousePressed = true;
}
}
ratio = 0.0;
double x = m_mousePos.x();
double y = clientRect.width();
ratio = x / y;
lengthToMouse = 800* ratio; // 利用鼠标在屏幕的比例来设置鼠标在可用窗体的位置
}
void Widget::mouseMoveEvent(QMouseEvent*event)
{
//bool bMaximize = this->isMaximized(); // isMaximized() 不一定返回我们期望的值
int x = m_mousePos.x() - lengthToMouse;
int y = m_mousePos.y() - 2/* - m_mousePos.y()*/;
QPoint point(x,y);
if (m_mousePressed) {
if (isMaxWindow) {
//this->showNormal(); // 拖动最大化的窗口是否需要变成正常?
resize(800, 600);
move(x, y);
isMaxWindow = false;
m_windowPos=point;
} else {
this->move(m_windowPos + (event->globalPos() - m_mousePos));
}
if(event->globalY() < 4){ // 鼠标拖动窗体到屏幕顶端最大化窗体
move(0, 0);
resize(clientRect.width(), clientRect.height());
isMaxWindow = true;
}
if(event->globalX() < 4){// 鼠标拖动窗体到屏幕最左端窗体占左半边屏幕大小
resize(clientRect.width() / 2, clientRect.height());
move(0, 0);
isMaxWindow = false;
}
if(event->globalX() > clientRect.width() - 4){// 鼠标拖动窗体到屏幕最右端窗体占右半边屏幕大小
resize(clientRect.width() / 2, clientRect.height());
move(clientRect.width() / 2, 0);
isMaxWindow = false;
}
}
updateNormalBtn();
}
void Widget::mouseReleaseEvent(QMouseEvent*event)
{
if(event->button() == Qt::LeftButton)
m_mousePressed = false;
}
void Widget::maxRestoreSlot()
{
//this->isMaximized() ? showNormal() : showMaximized();
if(isMaxWindow){
resize(800, 600);
move((clientRect.width() - this->width())/2, (clientRect.height() - this->height())/2); // 居中
isMaxWindow = false;
}else{
//showMaximized();
resize(clientRect.width(), clientRect.height());
move(0, 0);
isMaxWindow = true;
}
updateNormalBtn();
}
void Widget::updateNormalBtn()
{
isMaxWindow ? m_normalBtn->setText(tr("还原")) : m_normalBtn->setText(tr("最大化"));
}
窗体界面如下:
案例源码以上传到:http://download.csdn.net/detail/qq_33218979/9905608
相关文章推荐
- 去掉winform边框,实现最大化最小化及关闭功能
- C# 如何窗体去掉上面的最大化,最小化合关闭以及实现无边框窗体拖动【申明:来源于网络】
- 【Qt】自定义标题栏并实现最小化/最大化/关闭窗口功能
- 窗体最大化、最小化、隐藏、关闭功能及程序退出功能的按钮实现
- C# 如何窗体去掉上面的最大化,最小化合关闭以及实现无边框窗体拖动
- C# 无边框窗体移动 点击任务栏实现最小化与还原
- 捕捉窗体的最小化、最大化、还原消息和关闭消息
- 对无边框的QT窗体设置点击任务栏按钮最小化和还原事件
- 父窗体不能最大化,也不能最小化,用户也不能拖动的实现
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现
- [Win32]只允许最大化最小化窗口,禁止双击标题栏、拖动窗体、点击复原按钮来改变窗口大小
- 对无边框的QT窗体设置点击任务栏按钮最小化和还原事件
- 对无边框的QT窗体设置点击任务栏按钮最小化和还原事件
- C# WinForm开发系列之自定义无边框窗体(最大化,最小化,关闭,拉伸和移动的相关知识)
- 关于右键菜单实现子窗口最大化,最小化,还原和关闭的小感想
- JFrame实现无边框,实现拖动,实现关闭按钮,打开实现保存文件到本地,实现头像放大功能,实现图片浏览器
- 不拖动标题栏移动窗体,最大化窗体,最小化窗体,还原窗体
- 用div实现弹出窗口,拖动,最大化,最小化,关闭
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法
- C#实现无边框窗体点击任务栏图标正常最小化和还原