Qt 自定义窗体的简单实现(一)

ゞ 浴缸里的玫瑰 2022-02-24 23:53 317阅读 0赞

Qt 自定义窗体的简单实现(一)

一、简述

  1. 记--简单的模仿飞秋界面。
  2. 例子打包:链接: https://pan.baidu.com/s/1IfnCd5HbyUSxK7rmRjBKRQ 提取码: cnds

二、效果

  1. ![20190330232730520.gif][]

三、工程结构

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70][]

四、源文件

MyFeiQ.pro文件

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2019-01-07T14:14:15
  4. #
  5. #-------------------------------------------------
  6. QT += core gui
  7. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  8. TARGET = MyFeiQ
  9. TEMPLATE = app
  10. SOURCES += main.cpp\
  11. myfeiq.cpp
  12. HEADERS += myfeiq.h
  13. FORMS += myfeiq.ui
  14. RESOURCES += \
  15. res.qrc

main.cpp文件

  1. #include "myfeiq.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MyFeiQ w;
  7. w.show();
  8. return a.exec();
  9. }

myfeiq.h文件

  1. #ifndef MYFEIQ_H
  2. #define MYFEIQ_H
  3. #include <QWidget>
  4. #include <QPoint>//坐标点
  5. #include <QMouseEvent>//鼠标事件
  6. namespace Ui {
  7. class MyFeiQ;
  8. }
  9. class MyFeiQ : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MyFeiQ(QWidget *parent = 0);
  14. ~MyFeiQ();
  15. protected:
  16. void mousePressEvent(QMouseEvent *e);//重写鼠标按下事件
  17. void mouseReleaseEvent(QMouseEvent *);//重写鼠标释放事件
  18. void mouseMoveEvent(QMouseEvent *e);//重写鼠标移动事件
  19. void enterEvent(QEvent *); //重写鼠标进入事件
  20. void leaveEvent(QEvent *); //重写鼠标离开事件
  21. private slots:
  22. void on_btnClose_clicked();
  23. void on_btnMin_clicked();
  24. private:
  25. Ui::MyFeiQ *ui;
  26. QPoint m_beginPos;//用来记录鼠标的按下的开始位置
  27. bool m_press;//用来记录鼠标是否处于按下状态AA
  28. };
  29. #endif // MYFEIQ_H

myfeiq.cpp文件

  1. #include "myfeiq.h"
  2. #include "ui_myfeiq.h"
  3. MyFeiQ::MyFeiQ(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::MyFeiQ)
  6. {
  7. ui->setupUi(this);
  8. //设置窗体无边框.//setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint|Qt::WindowStaysOnTopHint);
  9. this->setWindowFlags(Qt::FramelessWindowHint);
  10. m_press = false;
  11. //鼠标悬停在按钮上面的时候背景色变化
  12. ui->btnClose->setStyleSheet("QPushButton{border-image:url(:/res/imgs/close.png);} QPushButton:hover{border-image:url(:/res/imgs/closeHover.png);}");
  13. ui->btnMin->setStyleSheet("QPushButton{border-image:url(:/res/imgs/min.png);} QPushButton:hover{border-image:url(:/res/imgs/minHover.png);}");
  14. ui->btnHeadPortrait->setStyleSheet("QPushButton{border-image:url(:/res/imgs/headPortrait.png);} QPushButton:hover{border-image:url(:/res/imgs/headPortraitHover.png);}");
  15. //取得焦点和失去焦点的时候背景颜色变化
  16. ui->lineEditSignature->setStyleSheet("QLineEdit:blur{border-image:url(:/res/imgs/bg.png);} QLineEdit:focus{border-image:url(:/res/imgs/bg3.png);}");
  17. }
  18. MyFeiQ::~MyFeiQ()
  19. {
  20. delete ui;
  21. }
  22. void MyFeiQ::mousePressEvent(QMouseEvent *e)//鼠标按下事件
  23. {
  24. if(e->button() == Qt::LeftButton )//鼠标左键按下
  25. {
  26. m_press = true;
  27. m_beginPos = e->pos();//鼠标相对窗体的位置
  28. }
  29. }
  30. void MyFeiQ::mouseReleaseEvent(QMouseEvent *)//鼠标释放事件
  31. {
  32. m_press = false;
  33. }
  34. void MyFeiQ::mouseMoveEvent(QMouseEvent *e) //--鼠标移动事件
  35. {
  36. if (m_press)//鼠标是按下状态的
  37. {
  38. //当前鼠标相对窗体的位置-刚按下左键时的相对位置=鼠标移动的大小
  39. //鼠标移动的大小+窗体原来的位置=窗体移动后的位置
  40. this->move(e->pos() - m_beginPos + this->pos());
  41. }
  42. }
  43. void MyFeiQ::on_btnClose_clicked()//关闭
  44. {
  45. this->close();
  46. }
  47. void MyFeiQ::on_btnMin_clicked()//最小化
  48. {
  49. this->showMinimized();
  50. }
  51. void MyFeiQ::enterEvent(QEvent *) //--鼠标进入窗体范围事件
  52. {
  53. if(this->pos().y()<=0)//鼠标进入并且已经上贴边
  54. {
  55. move(pos().x(),0);//弹出整个窗体--x不变,y起始设为上边框
  56. }
  57. }
  58. void MyFeiQ::leaveEvent(QEvent *) //鼠标离开窗体范围事件
  59. {
  60. if(this->pos().y()<=0)//窗体贴在屏幕上边
  61. {
  62. move(pos().x(), 1-this->height());//贴边,其实就是只露出一点点,设置起始位置另窗体大部分不在可视区域
  63. }
  64. }

界面布局:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 1

五、总结

1、实现无边框

  1. this->setWindowFlags(Qt::FramelessWindowHint);

2、无边框拖动

重写鼠标按下、释放、移动事件,监听鼠标动作,使得窗体跟随鼠标移动。

当鼠标按下—-记下,作为起始位置

鼠标按下时—鼠标移动量就是窗体的移动量

  1. if (m_press)//鼠标是按下状态的
  2. {
  3. //当前鼠标相对窗体的位置-刚按下左键时的相对位置=鼠标移动的大小
  4. //鼠标移动的大小+窗体原来的位置=窗体移动后的位置
  5. this->move(e->pos() - m_beginPos + this->pos());
  6. }

3、上贴边

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 2][]
  2. move(pos().x(), 1-this->height());//贴边,其实就是只露出一点点,设置起始位置另窗体大部分不在可视区域

4、鼠标悬停样式变化

  1. //鼠标悬停在按钮上面的时候背景色变化
  2. ui->btnClose->setStyleSheet("QPushButton{border-image:url(:/res/imgs/close.png);} QPushButton:hover{border-image:url(:/res/imgs/closeHover.png);}");
  3. ui->btnMin->setStyleSheet("QPushButton{border-image:url(:/res/imgs/min.png);} QPushButton:hover{border-image:url(:/res/imgs/minHover.png);}");
  4. ui->btnHeadPortrait->setStyleSheet("QPushButton{border-image:url(:/res/imgs/headPortrait.png);} QPushButton:hover{border-image:url(:/res/imgs/headPortraitHover.png);}");
  5. //取得焦点和失去焦点的时候背景颜色变化
  6. ui->lineEditSignature->setStyleSheet("QLineEdit:blur{border-image:url(:/res/imgs/bg.png);} QLineEdit:focus{border-image:url(:/res/imgs/bg3.png);}");

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 3

5、待完善

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt定义事件实现

    在Qt中我们会遇到两种事件一种是Qt中的系统时间了,另外一种就是Qt自定义事件。 Qt 的自定义事件主要的实现: Qt 的事件处理,实际上是有五个层次:重定义事件处理函数,

    相关 WPF适应实现小结

    这几天,因工作需要,要对一个小软件进行UI调整。主要内容就是让其能够实现自适应窗体(包括文字和图标),做成像WIN7下的Media Center一样的UI。自适应窗体,顾名思义

    相关 QT变为顶层

    QT将窗体变为顶层窗体 在windows上通过鼠标双击某应用程序图标,该应用程序往往会以顶层窗口的形式呈现在我们面前,但是对于一个已经打开的非顶层窗口,我们怎么将其激活为