• QT自定义标题栏的可拖拽窗口


    由于项目的实际需要,窗口不能使用默认样式,需要实现无边框和qstylesheet加载样式文件,移除标题栏后窗口无法拖动,所有需要在widget的基础上重载mouse的press、move、release三个事件,但由于qwidget不能直接加载style样式,所以在qframe的基础进行重载。

    1. 构建FrameTitleBar支持拖动类

     1 #include "frametitlebar.h"
     2 
     3 FrameTitleBar::FrameTitleBar(QWidget *parent) :
     4     QFrame(parent),
     5     m_isPressed(false)
     6 {
     7 }
     8 
     9 void FrameTitleBar::mousePressEvent(QMouseEvent* event)
    10 {
    11     m_isPressed = true;
    12     m_startMovePos = event->globalPos();
    13 
    14     return QFrame::mousePressEvent(event);
    15 }
    16 
    17 void FrameTitleBar::mouseMoveEvent(QMouseEvent* event)
    18 {
    19     if (m_isPressed)
    20     {
    21         QPoint movePoint = event->globalPos() - m_startMovePos;
    22 
    23         if(parentWidget())
    24         {
    25             QPoint widgetPos = this->parentWidget()->pos();
    26             m_startMovePos = event->globalPos();
    27             parentWidget()->move(widgetPos.x() + movePoint.x(), widgetPos.y() + movePoint.y());
    28         }
    29     }
    30 
    31     return QFrame::mouseMoveEvent(event);
    32 }
    33 
    34 void FrameTitleBar::mouseReleaseEvent(QMouseEvent* event)
    35 {
    36     m_isPressed = false;
    37 
    38     return QFrame::mouseReleaseEvent(event);
    39 }
     1 #ifndef FRAMETITLEBAR_H
     2 #define FRAMETITLEBAR_H
     3 
     4 #include <QFrame>
     5 #include <QMouseEvent>
     6 
     7 class FrameTitleBar : public QFrame
     8 {
     9 public:
    10     FrameTitleBar(QWidget *parent = 0);
    11 
    12 protected:
    13     virtual void mousePressEvent(QMouseEvent* event);
    14     virtual void mouseMoveEvent(QMouseEvent* event);
    15     virtual void mouseReleaseEvent(QMouseEvent* event);
    16 
    17 private:
    18     bool            m_isPressed;
    19     QPoint          m_startMovePos;
    20 };
    21 
    22 #endif // FRAMETITLEBAR_H

    2. 在需要添加的无边框窗口上,拖拽出一个frame控件,设置好位置,然后提升为FrameTitleBar类,添加自己的相关按钮(现在使用的qss进行风格样式的设置)

    3. 设置父窗口的无边框样式setWindowFlags(Qt::Window | Qt::FramelessWindowHint); 如果没有Qt::Window标志,则不可以拖到父窗口外。

    
    
  • 相关阅读:
    Sublime Text 3
    JobTracker等相关功能模块初始化
    .NET编程规范
    理解多线程设计模式(转)
    理解java中的ThreadLocal 专题
    情商--人生职场
    老师只喜欢好学生(转)
    不是因为项目让你不能发光,而是因为你才让项目不能发光
    考试系统--前进/后退功能
    tomcat配置文件server.xml具体解释
  • 原文地址:https://www.cnblogs.com/jobgeo/p/6895105.html
Copyright © 2020-2023  润新知