1. 程式人生 > >Qt 之自定義介面(實現無邊框、可移動)

Qt 之自定義介面(實現無邊框、可移動)

簡述

UI設計是指對軟體的人機互動、操作邏輯、介面美觀的整體設計。好的UI設計不僅是讓軟體變得有個性、有品位,還要讓軟體的操作變得舒適簡單、自由,充分體現軟體的定位和特點。

愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。一個產品擁有美觀的介面會給人帶來舒適的視覺享受,拉近人與產品的距離,是建立在科學性之上的藝術設計。

檢驗一個介面的標準-既不是某個專案開發組領導的意見,也不是專案成員投票的結果,而是終端使用者的感受。

所以,對於大多數商業軟體或者專業產品來說,Qt的本地化樣式顯然已經不能滿足期望,我們需要進行大量的樣式美化,才能夠讓它更有個性、有品位。

|

下面我們來實現這樣一個介面。

這裡寫圖片描述

無邊框

設定視窗標誌為無邊框

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

關於WindowFlags列舉值很多,其中有一個WindowStaysOnTopHint,可以讓窗體位於所有介面之上,類似於QQ主面板,一開啟就在所有軟體之上-比較霸道。

設定無邊框之後,窗體是無法移動的,下面我們介紹兩種方式來進行移動。

可移動

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->pos() - m_point + pos()); } // 設定滑鼠未被按下 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

傳送系統訊息,進行移動

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