当前位置: 首页 > news >正文

Qt无边框设计

//指定窗口为无边框
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);

重写鼠标事件:

void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;

定义位置:

QPoint diff_pos;//鼠标和窗口的相对位移QPoint window_pos;//绝对位置QPoint mouse_pos;
void QtWidgetsApplication2::mousePressEvent(QMouseEvent * event)
{mouse_pos = event->globalPos();window_pos = this->pos();diff_pos = mouse_pos - window_pos;}void QtWidgetsApplication2::mouseMoveEvent(QMouseEvent * event)
{QPoint pos = event->globalPos();this->move(pos - diff_pos);
}

再创建一个widget作为标题栏,并定义好控件:

#include <QWidget>
#include <QLabel>
#include <QPushButton>class CTitleBar : public QWidget
{Q_OBJECTpublic:CTitleBar(QWidget *parent = nullptr);~CTitleBar();private:void init();private:QLabel* logo;QLabel* title;QPushButton* set;QPushButton* min;QPushButton* max;QPushButton* close;
};

初始化控件:

void CTitleBar::initUI()
{logo = new QLabel(this);title = new QLabel(this);title->setText(u8"标题");title->setFixedWidth(120);set = new QPushButton(this);set->setFixedSize(32, 32);min = new QPushButton(this);min->setFixedSize(32, 32);max = new QPushButton(this);max->setFixedSize(32, 32);close = new QPushButton(this);close->setFixedSize(32, 32);QHBoxLayout* lay = new QHBoxLayout(this);lay->addWidget(logo);lay->addWidget(title);lay->addWidget(set);lay->addWidget(min);lay->addWidget(max);lay->addWidget(close);lay->setContentsMargins(5, 5, 5,5);
}

实现无边窗口的拉伸、改变大小:

重写nativeEvent:

#include <qt_windows.h>
bool nativeEvent(const QByteArray& eventType, void* message, long* result) override;bool QtWidgetsApplication2::nativeEvent(const QByteArray & eventType, void * message, long * result)
{MSG* param = static_cast<MSG*>(message);switch (param->message){case WM_NCHITTEST:{int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();/*if (childAt(nX, nY) != nullptr)return QWidget::nativeEvent(eventType, message, result);*/if (nX > m_nBorderWidth && nX < this->width() - m_nBorderWidth &&nY > m_nBorderWidth && nY < this->height() - m_nBorderWidth){if (childAt(nX, nY) != nullptr)return QWidget::nativeEvent(eventType, message, result);}if ((nX > 0) && (nX < m_nBorderWidth))*result = HTLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width()))*result = HTRIGHT;if ((nY > 0) && (nY < m_nBorderWidth))*result = HTTOP;if ((nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOM;if ((nX > 0) && (nX < m_nBorderWidth) && (nY > 0)&& (nY < m_nBorderWidth))*result = HTTOPLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())&& (nY > 0) && (nY < m_nBorderWidth))*result = HTTOPRIGHT;if ((nX > 0) && (nX < m_nBorderWidth)&& (nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOMLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())&& (nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOMRIGHT;return true;}}return false;
}

启用鼠标悬停事件:

setAttribute(Qt::WA_Hover)

http://www.lryc.cn/news/239843.html

相关文章:

  • 规则引擎Drools使用,0基础入门规则引擎Drools(二)高级语法
  • C语言二十三弹---求第N项斐波那契数列的值
  • Pickcode:教孩子们编码的新视觉语言
  • 乐划锁屏插画大赏热度持续,进一步促进价值内容的创造与传播
  • 【ArcGIS Pro微课1000例】0034:矢量数据几何校正案例(Spatial Adjustment)
  • 2023亚太杯数学建模B题:玻璃温室中的微气候法规,思路模型代码论文
  • Eclipse常用设置-乱码
  • MySQL面试,MySQL事务,MySQL锁,MySQL集群,主从,MySQL分区,分表,InnoDB
  • HarmonyOS应用开发者认证题目满分指南
  • openssl+ SM2 + linux 签名校验开发实例(C++)
  • 有关Vue、微信小程序、UniApp中的CSS中的宽度width单位、自适应
  • 黑马React18: ReactRouter
  • 算法刷题-动态规划-1
  • 分享一篇很就以前的文档-VMware Vsphere菜鸟篇
  • QT中的lambda表达式
  • linux文件I/O:文件锁的概念、函数以及代码实现
  • MySQL数据库系统教程
  • 这样写postman实现参数化,阿里p8都直呼牛逼
  • 【Qt-25】控件篇
  • 《算法通关村——反转字符串中的单词问题解析》
  • C++使用Tensorflow2.6训练好的模型进行预测
  • 5-1 Java 网络编程
  • 汇编-CALL和RET指令
  • STM32_5(中断)
  • docker 部署hbase 并且java Api连接
  • EasyExcel listener无法通过Autowired注入xxMapper
  • Android Spannable 使用​注意事项
  • Apache访问控制
  • 二、类与对象(二)
  • Pytorch从零开始实战10