Qt中的坐標系統

来源:http://www.cnblogs.com/songhe364826110/archive/2017/01/19/6298768.html
-Advertisement-
Play Games

Qt使用統一的坐標系統來定位視窗部件的位置和大小。 以屏幕的左上角為原點即(0, 0)點,從左向右為x軸正向,從上向下為y軸正向,這整個屏幕的坐標系統就用來定位頂層視窗; 此外,視窗內部也有自己的坐標系統,它依然以左上角作為原點,從左向右為x軸正向,從上向下為y軸正向,原點、x軸、y軸圍成的區域叫做 ...


Qt使用統一的坐標系統來定位視窗部件的位置和大小。

以屏幕的左上角為原點即(0, 0)點,從左向右為x軸正向,從上向下為y軸正向,這整個屏幕的坐標系統就用來定位頂層視窗

此外,視窗內部也有自己的坐標系統,它依然以左上角作為原點,從左向右為x軸正向,從上向下為y軸正向,原點、x軸、y軸圍成的區域叫做Client Area(客戶區),在客戶區的周圍則是標題欄(Windows Title)和邊框(Frame)。

 

有了Qt坐標系統的一些基礎概念,那麼具體該如何來進行視窗部件的定位呢?QWidget類,也就是所有視窗組件的父類都提供了成員函數來在坐標系統中進行定位。

從上圖可以看出這些成員函數有三類:

——QWidget直接提供的成員函數:x()、y()獲得視窗左上角的坐標,width()、height()獲得客戶區的寬和高

——QWidget的geometry()提供的成員函數:x()、y()獲得客戶區左上角的坐標,width()、height()獲得客戶區的寬和高

——QWidget的frameGeometry()提供的成員函數:x()、y()獲得視窗左上角的坐標,width()、height()獲得包含客戶區、標題欄和邊框在內的整個視窗的寬和高

測試程式:

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QtGui/QWidget>
 5 
 6 class Widget : public QWidget
 7 {
 8     Q_OBJECT
 9 public:
10     Widget();
11     ~Widget();
12 };
13 
14 #endif // WIDGET_H
 1 #include "Widget.h"
 2 
 3 Widget::Widget()
 4 {
 5 
 6 }
 7 
 8 Widget::~Widget()
 9 {
10     
11 }
 1 #include <QtGui/QApplication>
 2 #include <QPushButton>
 3 #include <QDebug>
 4 #include "Widget.h"
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication a(argc, argv);
 9     Widget w;
10     QPushButton b(&w);
11 
12     b.setText("Button");
13     b.resize(100, 40);
14     b.move(20, 20);      //以Client Area左上角為(0, 0)點
15 
16     w.resize(800, 500);  //不同操作系統可能對視窗最小寬度有規定,若設置寬度小於規定值,則會以規定值進行顯示
17     w.move(200, 200);    //以屏幕左上角為(0, 0)點
18     w.show();
19 
20     qDebug() << "QWidget";
21     qDebug() << w.x();
22     qDebug() << w.y();
23     qDebug() << w.width();
24     qDebug() << w.height();
25 
26     qDebug() << "QWidget::geometry";
27     qDebug() << w.geometry().x();
28     qDebug() << w.geometry().y();
29     qDebug() << w.geometry().width();
30     qDebug() << w.geometry().height();
31 
32     qDebug() << "QWidget::frameGeometry";
33     qDebug() << w.frameGeometry().x();
34     qDebug() << w.frameGeometry().y();
35     qDebug() << w.frameGeometry().width();
36     qDebug() << w.frameGeometry().height();
37     
38     return a.exec();
39 }

輸出結果:

 在上面這個程式中,有兩點需要補充說明:

第一,geometry()和frameGeometry()提供的坐標函數必須在show()調用之後使用才有效,否則會得到無效的數據;

第二,不同的操作系統可能對視窗的最小寬度有所規定,在使用void resize(int width, int height)設置頂層視窗大小時,若width小於規定的最小寬度,則會以規定的最小寬度進行顯示,經個人測試,這個最小寬度對於win7 x64為116,對於win8.1 x64為160,因此在編寫跨平臺的程式時,有時候可能需要考慮到這個特性。

 

說到跨平臺,這裡還有一個問題:在不同的平臺中(如windows和linux),視窗的外觀式樣是不一樣的,這種差異體現在邊框的寬度不一樣、標題欄的寬度和高度不一樣。Qt之所以在坐標系統相關的函數中,提供三組不同的函數出來,正是為了實現跨平臺。

因為圖形用戶界面一般都是以像素為單位進行定位的,因此若想以跨平臺的方式精確定位,就必須考慮到不同平臺標題欄和邊框的大小差異,QWidget圍繞標題欄和邊框提供的三組既相互聯繫又相互區別的函數,就可以解決這個問題。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要 在寫這篇文章之前,自己思索了很多,也是因為一些事情觸發了自己,使得自己想寫這麼一篇文章。也算是對2016年自己的一個總結吧。 正文 先說說我自己吧!本人16年於一所二本學校畢業,考過研,夢想著上北航,結果卻因政治考的太差沒能上,說起來很慚愧。英雄都不提往事,何況我這一個失敗的狗熊呢!不,是失敗 ...
  • 第4章 類型和聲明 4.2 布爾量 按照定義,true具有值1,而false具有值0.整數可以隱式地轉換到bool值。指針也可以隱式地轉換到bool,非零指針轉為true,具有零值的指針轉為false。 4.3 字元類型 一個char類型幾乎都包含8個二進位位,這裡還提供了另一個類型wchar_t用 ...
  • 需要 prettytime-3.2.3.Final.jar 包 代碼例子 輸出結果 ...
  • 上節我們探討了通過scalaz-stream-fs2來驅動一套數據處理流程,用fs2的Pipe類型來實現對數據流的逐行操作。本篇討論準備在上節討論的基礎上對數據流的流動和元素操作進行優化完善。如數據流動中增加諸如next、skip、eof功能、內容控制中增加對行元素的append、insert、up ...
  • 偽靜態是一種可以把文件尾碼改成任何可能的一種方法,如果我想把PHP文件偽靜態成html文件,這種相當簡單的,下麵來介紹nginx 偽靜態配置方法有需要瞭解的朋友可參考。 nginx里使用偽靜態是直接在nginx.conf 中寫規則的,並不需要像apache要開啟寫模塊(mod_rewrite)才能進 ...
  • 一佛是阿裡巴巴B2B事業群高級產品經理。從事多年互聯網系統的研發和測試工作,目前主要負責雲效分層自動化測試的產品設計。因為自動化測試在實踐過程中,總是碰到各種各樣的問題,導致進入自動化測試盲區。所以,一佛就根據當下環境並結合解決案例,來講解瞭如何把握分層自動化的分層策略,如何將分層自動化融入到項目流 ...
  • 年前接到個任務,說要解決線上一些手機客戶端介面報錯率很高的問題.拿到了監控郵件,粗略一看,各種50%+的錯誤率,簡直觸目驚心.這種疑難雜症解決起來還是挺好玩的,於是擼起袖子action.最終的結果雖然報錯問題得到瞭解決,但是感覺並不是最根本的解決方案. ...
  • 前邊以及陸陸續續的介紹了使用Swift3.0開發的服務端應用程式的Perfect框架。本篇博客就做一個階段性的總結,做一個完整的實例,其實這個實例在《Swift3.0服務端開發(一)》這篇博客中已經簡單的介紹過了,本篇博客就來詳細的聊一下這個工程的具體實現細節。當然包括iOS端和服務端的代碼。本篇博 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...