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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...