1. 程式人生 > >【Qt】Qt之自定義介面(窗體縮放)【轉】

【Qt】Qt之自定義介面(窗體縮放)【轉】

簡述

通過前兩節內容,我們實現了自定義窗體的移動,以及自定義標題欄-用來顯示窗體的圖示、標題,以及控制窗體最小化、最大化、關閉。

在這之後,我們還缺少窗體的縮放-當滑鼠移動到窗體的邊框-左、上、右、下、左上角、左下角、右上角、右下角時候,滑鼠變為相應的樣式,並且窗體可以隨著滑鼠拖動而進行放大、縮小。

效果

這裡寫圖片描述

窗體縮放

實現

包含標頭檔案與需要用到的庫

#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Windowsx.h>
#endif

使用nativeEvent進行窗體縮放

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    Q_UNUSED(eventType)

    MSG *param = static_cast<MSG *>(message);

    switch (param->message)
    {
    case WM_NCHITTEST:
    {
        int nX = GET_X_LPARAM(param->lParam) - this
->geometry().x(); int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y(); // 滑鼠區域位於標題欄按鈕之上,則不進行處理 QList<QPushButton *> buttons = m_pTitleBar->findChildren<QPushButton *>(); foreach (QPushButton *pButton, buttons) { if
(pButton->geometry().contains(QPoint(nX, nY))) { *result = HTCLIENT; return true; } } // 滑鼠區域位於標題欄中,進行移動 if (nX >= m_nBorder && nX <= this->width() - m_nBorder && nY >= m_nBorder && nY <= m_pTitleBar->height()) { *result = HTCAPTION; return true; } // 滑鼠區域位於窗體邊框,進行縮放 if ((nX > 0) && (nX < m_nBorder)) *result = HTLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width())) *result = HTRIGHT; if ((nY > 0) && (nY < m_nBorder)) *result = HTTOP; if ((nY > this->height() - m_nBorder) && (nY < this->height())) *result = HTBOTTOM; if ((nX > 0) && (nX < m_nBorder) && (nY > 0) && (nY < m_nBorder)) *result = HTTOPLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width()) && (nY > 0) && (nY < m_nBorder)) *result = HTTOPRIGHT; if ((nX > 0) && (nX < m_nBorder) && (nY > this->height() - m_nBorder) && (nY < this->height())) *result = HTBOTTOMLEFT; if ((nX > this->width() - m_nBorder) && (nX < this->width()) && (nY > this->height() - m_nBorder) && (nY < this->height())) *result = HTBOTTOMRIGHT; return true; } } return QWidget::nativeEvent(eventType, message, result); }

介面說明

Qt5與Qt4其中的一個區別就是用nativeEvent代替了winEvent。

nativeEvent主要用於程序間通訊-訊息傳遞。在這裡我們主要進行窗體縮放,其中還添加了一些限制,比如:

  1. 滑鼠區域位於標題欄按鈕之上,則不進行處理。
  2. 滑鼠區域位於標題欄中,進行移動。

使用這種方式後,窗體就可以隨意縮放了,而且可以去掉標題欄中控制介面移動的程式碼-在mousePressEvent中使用SendMessage來進行移動。

當然,這種實現只能在Windows下使用,因為用的是Win API,如果需要跨平臺的話,需要自己處理各種事件,而且得考慮的很全面。

相關推薦

QtQt定義介面窗體

簡述 通過前兩節內容,我們實現了自定義窗體的移動,以及自定義標題欄-用來顯示窗體的圖示、標題,以及控制窗體最小化、最大化、關閉。 在這之後,我們還缺少窗體的縮放-當滑鼠移動到窗體的邊框-左、上、右、下、左上角、左下角、右上角、右下角時候,滑鼠變為相應的樣式,並且窗體可以隨著滑鼠拖動而進行放大、縮小。

QtQt定義介面窗體-跨平臺終極版

簡述 通過上一節內容,我們實現了窗體的縮放,功能很不錯,但是很遺憾-不支援跨平臺!如果對於多平臺來說,這是一個硬傷,所以,我們急需要一個能夠支援跨平臺的實現方案。 在網上看到過很多不同的實現方式,多多少少會存在一些問題-要麼融合度太高、要麼不能很好地進行移動、縮放。基於前人的分享與總結,最後,我花了很

QtQt定義介面右下角冒泡

簡述 網頁右下角上經常會出現一些提示性的資訊,桌面軟體中也比較常見,類似360新聞、QQ訊息提示一樣! 這種功能用動畫實現起來很簡單,這節我們暫時使用定時器來實現,後面章節會對動畫框架進行詳細講解。 下面我們來實現一個右下角冒泡的功能。 簡述 效果 實現原理 實現 效果

Qt 定義介面右下角冒泡

簡述 網頁右下角上經常會出現一些提示性的資訊,桌面軟體中也比較常見,類似360新聞、QQ訊息提示一樣! 這種功能用動畫實現起來很簡單,這節我們暫時使用定時器來實現,後面章節會對動畫框架進行詳細講解。 下面我們來實現一個右下角冒泡的功能。 | 效果

QtQt定義介面實現無邊框、可移動

簡述 UI設計是指對軟體的人機互動、操作邏輯、介面美觀的整體設計。好的UI設計不僅是讓軟體變得有個性、有品位,還要讓軟體的操作變得舒適簡單、自由,充分體現軟體的定位和特點。 愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。一個產品擁有美觀的介面會給人帶來舒適的視覺享受,拉近人與產品的

QtQt定義介面QMessageBox

簡述 通過前幾節的自定義窗體的學習,我們可以很容易的寫出一套屬於自己風格的介面框架,通用於各種窗體,比如:QWidget、QDialog、QMainWindow。 大多數窗體的實現都是採用控制元件堆積來完成的,只要思路清晰,再複雜的介面實現起來都遊刃有餘。下面我來列舉一個由QMessageBox擴充套

QtQt定義介面新增定義標題欄

簡述 通過上節內容,我們實現了自定義窗體的移動,但是我們缺少一個標題欄來顯示窗體的圖示、標題,以及控制窗體最小化、最大化、關閉的按鈕。 自定義標題欄後,所有的控制元件我們都可以定製,比如:在標題欄中新增換膚、設定按鈕以及其他控制元件。 簡述 效果 自定義標題欄 實現 介面說明

Qt 定義介面實現無邊框、可移動

簡述 UI設計是指對軟體的人機互動、操作邏輯、介面美觀的整體設計。好的UI設計不僅是讓軟體變得有個性、有品位,還要讓軟體的操作變得舒適簡單、自由,充分體現軟體的定位和特點。 愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。一個產品擁有美觀的

Qt 定義介面QMessageBox

簡述 通過前幾節的自定義窗體的學習,我們可以很容易的寫出一套屬於自己風格的介面框架,通用於各種窗體,比如:QWidget、QDialog、QMainWindow。 大多數窗體的實現都是採用控制元件堆積來完成的,只要思路清晰,再複雜的介面實現起來都遊刃有餘。下

android定義View定義EditText新增刪除功能

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

Android 定義佈局繼承控制元件

就是繼承已有的控制元件,建立新控制元件,保留繼承的父控制元件的特性,並且還可以引入新特性。下面就以支援橫向滑動刪除列表項的自定義ListView的實現來介紹。 1、建立刪除按鈕佈局delete_btn.xml,這個佈局是在橫向滑動列表項後顯示的: <?xml version="1.0" en

微服務時代定義archetype模板/骨架/腳手架

1. 場景描述 (1)隨著微服務越來越常見,一個大的專案會被拆分成多個小的微服務,jar包以及jar之間的版本衝突問題,變得越來越常見,如何保持整體微服務群jar及版本統一,也變成更加重要了,maven的自定義archetype(模板/骨架/腳手架)很好的解決了這個問題,在新建微服務專案的時候,使用統一的ar

QT-模型檢視定義委託

檢視委託(Delegate)簡介 由於模型負責組織資料,而檢視負責顯示資料,所以當用戶想修改顯示的資料時,就要通過檢視中的委託來完成 檢視委託類似於傳統的MVC設計模式裡的Controller(控制器)角色 Model(模型) - 負責資料組織 View(檢視)&n

BLE-CC2640CC2640定義週期事件

本篇博文最後修改時間:2017年06月02日,00:29。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何使用系統提供的定時器執行一個自定義的週期事件。 二、實驗平臺 協議棧版本:ble_cc26xx_2_01_00_44423

Android定義裝置管理

需求:控制手機的攝像頭和錄音全部禁用~     這篇文章使用android提供的裝置管理器類DeviceAdminReceiver ,來實現禁用手機攝像頭的功能,還能夠改變密碼,鎖屏,重啟等功能,具體功能請去查API,如果我沒記錯的話有5千多行... ... 但是這篇文章主

Qt定義外掛for Qt Designer

QLedPlugin::QLedPlugin(QObject *parent) : QObject(parent) { initialized = false; } void QLedPlugin::initialize(QDesignerFormEditorInterface * )

ArcGIS Server10.1服務新特性WMTS1.0.0

class href 知識 技術分享 restful cgi art 存在 alt http://blog.csdn.net/esrichinacd/article/details/7825587 ArcGIS Server10.1正式支持OGC的WMTS1.0.0版

SpringMVC總結定義註解例:許可權註解

目錄 1.前言 2.自定義一個註解 3. 定義一個相應的攔截器 4.在springMVC配置檔案中進行配置 5.在springMVC controller中使用例項 1.前言 在開發過程中,我們想給控制器的某些方法進行控制訪問許可權,或者我們需要做方法呼叫日誌記錄

開發懸浮球SDK定義view流量球上篇 — 水波紋(波浪線)

本人開發懸浮球SDK大致流程及過程中遇到的問題和解決方法我會寫到我的部落格中。 (關於Paint 類,Path類,Canvas類相關具體詳解,請您拉到本部落格下方,點選連結方便您學習哦!) 自定義view的核心方法 onMeasure(int widthMeasureSpec,int hei

C# WinForm開發系列定義無邊框窗體(最大化,最小化,關閉,拉伸和移動的相關知識)

        ////重寫系統WndProc函式,使無邊框窗體可移動         protected override void WndProc(ref Message m)         {             switch (m.Msg)             {