【Qt】Qt之自定义界面(实现无边框、可移动)【转】

简述

UI设计是指对软件的人机交互、操做逻辑、界面美观的总体设计。好的UI设计不只是让软件变得有个性、有品位,还要让软件的操做变得温馨简单、自由,充分体现软件的定位和特色。css

爱漂亮之心人皆有之。其实软件界面就像工业造型同样,是产品的重要卖点。一个产品拥有美观的界面会给人带来温馨的视觉享受,拉近人与产品的距离,是创建在科学性之上的艺术设计。windows

检验一个界面的标准-既不是某个项目开发组领导的意见,也不是项目成员投票的结果,而是终端用户的感觉。api

因此,对于大多数商业软件或者专业产品来讲,Qt的本地化样式显然已经不能知足指望,咱们须要进行大量的样式美化,才可以让它更有个性、有品位。markdown

下面咱们来实现这样一个界面。less

这里写图片描述

无边框

设置窗口标志为无边框this

setWindowFlags(Qt::FramelessWindowHint | windowFlags());

关于WindowFlags枚举值不少,其中有一个WindowStaysOnTopHint,可让窗体位于全部界面之上,相似于QQ主面板,一打开就在全部软件之上-比较霸道。spa

设置无边框以后,窗体是没法移动的,下面咱们介绍两种方式来进行移动。.net

可移动

Qt事件

// 鼠标相对于窗体的位置 event->globalPos() - this->pos()
void Widget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_bPressed = true;
        m_point = event->pos();
    }
}

// 若鼠标左键被按下,移动窗体位置
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if (m_bPressed)
        move(event->globalPos() - m_point);
}

// 设置鼠标未被按下
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);

    m_bPressed = false;
}

Win API

包含头文件与须要用到的库设计

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#endif

发送系统消息,进行移动code

void Widget::mousePressEvent(QMouseEvent *event)
{
#ifdef Q_OS_WIN
    if (ReleaseCapture())
           SendMessage(HWND(winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
       event->ignore();
#else
#endif
}

原文做者:一去丶二三里
做者博客:去做者博客空间
相关文章
相关标签/搜索