【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
}

原文做者:一去丶二三裏
做者博客:去做者博客空間
相關文章
相關標籤/搜索