Qt中的坐標系統

轉載:原野追逐

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圍繞標題欄和邊框提供的三組既相互聯系又相互區別的函數,就可以解決這個問題。

轉載于:https://www.cnblogs.com/fuqia/p/8706148.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389930.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

預測股票價格 模型_建立有馬模型來預測股票價格

預測股票價格 模型前言 (Preface) If you are reading this, it’s most likely because you love to solve puzzles. I’m a very competitive person by nature. The Mt. Everest of puzzles, in my opinion, is trying to find excess returns through active trading in th…

Python 模塊 timedatetime

time & datetime 模塊 在平常的代碼中&#xff0c;我們常常需要與時間打交道。在Python中&#xff0c;與時間處理有關的模塊就包括&#xff1a;time&#xff0c;datetime,calendar(很少用&#xff0c;不講)&#xff0c;下面分別來介紹。 在開始之前&#xff0c;首先要說明幾…

大數模板Java

import java.util.*; import java.math.BigInteger; public class Main{public static void main(String args[]){Scanner cinnew Scanner(System.in);BigInteger a,b;acin.nextBigInteger();bcin.nextBigInteger();System.out.println(a.add(b));//加法System.out.println(a.…

檸檬工會_工會經營者

檸檬工會Hey guys! This week we’ll be going over some ways to work with result sets in MySQL. These result sets are the outputs of your everyday queries, such as:大家好&#xff01; 本周&#xff0c;我們將介紹一些在MySQL中處理結果集的方法。 這些結果集是您日常…

229. 求眾數 II

229. 求眾數 II 給定一個大小為 n 的整數數組&#xff0c;找出其中所有出現超過 ? n/3 ? 次的元素。 示例 1&#xff1a;輸入&#xff1a;[3,2,3] 輸出&#xff1a;[3]示例 2&#xff1a;輸入&#xff1a;nums [1] 輸出&#xff1a;[1]示例 3&#xff1a;輸入&#xff1a;…

寫給Java開發者看的JavaScript對象機制

幫助面向對象開發者理解關于JavaScript對象機制 本文是以一個熟悉OO語言的開發者視角&#xff0c;來解釋JavaScript中的對象。 對于不了解JavaScript 語言&#xff0c;尤其是習慣了OO語言的開發者來說&#xff0c;由于語法上些許的相似會讓人產生心理預期&#xff0c;JavaScrip…

Pythonic---------詳細講解

作者&#xff1a;半載流殤 鏈接&#xff1a;https://zhuanlan.zhihu.com/p/35219750 來源&#xff1a;知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。Pythonic&#xff0c;簡言之就是以Python這門語言獨特的方式寫出既簡潔又優美的代碼…

大數據ab 測試_在真實數據上進行AB測試應用程序

大數據ab 測試Hello Everyone!大家好&#xff01; I am back with another article about Data Science. In this article, I will write about what is A-B testing and how to use it on real life data-set to compare two advertisement methods.我回來了另一篇有關數據科…

492. 構造矩形

492. 構造矩形 作為一位web開發者&#xff0c; 懂得怎樣去規劃一個頁面的尺寸是很重要的。 現給定一個具體的矩形頁面面積&#xff0c;你的任務是設計一個長度為 L 和寬度為 W 且滿足以下要求的矩形的頁面。要求&#xff1a; 你設計的矩形頁面必須等于給定的目標面積。 寬度 …

node:爬蟲爬取網頁圖片

前言 周末自己在家閑著沒事&#xff0c;刷著微信&#xff0c;玩著手機&#xff0c;發現自己的微信頭像該換了&#xff0c;就去網上找了一下頭像&#xff0c;看著圖片&#xff0c;自己就想著作為一個碼農&#xff0c;可以把這些圖片都爬取下來做成一個微信小程序&#xff0c;說干…

如何更好的掌握一個知識點_如何成為一個更好的講故事的人3個關鍵點

如何更好的掌握一個知識點You’re launching a digital transformation initiative in the middle of the ongoing pandemic. You are pretty excited about this big-ticket investment, which has the potential to solve remote-work challenges that your organization fac…

centos 搭建jenkins+git+maven

gitmavenjenkins持續集成搭建發布人:[李源] 2017-12-08 04:33:37 一、搭建說明 系統&#xff1a;centos 6.5 jdk&#xff1a;1.8.0_144 jenkins&#xff1a;jenkins-2.93-1.1 git&#xff1a;git-2.9.0 maven&#xff1a;Maven 3.3.9 二、部署 2.1、jdk安裝 1&#xff09;下…

638. 大禮包

638. 大禮包 在 LeetCode 商店中&#xff0c; 有 n 件在售的物品。每件物品都有對應的價格。然而&#xff0c;也有一些大禮包&#xff0c;每個大禮包以優惠的價格捆綁銷售一組物品。 給你一個整數數組 price 表示物品價格&#xff0c;其中 price[i] 是第 i 件物品的價格。另有…

記錄一次spark連接mysql遇到的問題

在使用spark連接mysql的過程中報錯了&#xff0c;錯誤如下 08:51:32.495 [main] ERROR - Error loading factory org.apache.calcite.jdbc.CalciteJdbc41Factory java.lang.NoClassDefFoundError: org/apache/calcite/linq4j/QueryProviderat java.lang.ClassLoader.defineCla…

什么事數據科學_如果您想進入數據科學,則必須知道的7件事

什么事數據科學No way. No freaking way to enter data science any time soon…That is exactly what I thought a year back.沒門。 很快就不會出現進入數據科學的怪異方式 ……這正是我一年前的想法。 A little bit about my data science story: I am a complete beginner…

python基礎03——數據類型string

1. 字符串介紹 在python中&#xff0c;引號中加了引號的字符都被認為是字符串。 1 namejim 2 address"beijing" 3 msg My name is Jim, I am 22 years old! 那單引號、雙引號、多引號有什么區別呢&#xff1f; 1) 單雙引號木有任何區別&#xff0c;部分情況 需要考慮…

Java基礎-基本數據類型

Java中常見的轉義字符: 某些字符前面加上\代表了一些特殊含義: \r :return 表示把光標定位到本行行首. \n :next 表示把光標定位到下一行同樣的位置. 單獨使用在某些平臺上會產生不同的效果.通常這兩個一起使用,即:\r\n. 表示換行. \t :tab鍵,長度上相當于四個或者是八個空格 …

季節性時間序列數據分析_如何指導時間序列數據的探索性數據分析

季節性時間序列數據分析為什么要進行探索性數據分析&#xff1f; (Why Exploratory Data Analysis?) You might have heard that before proceeding with a machine learning problem it is good to do en end-to-end analysis of the data by carrying a proper exploratory …

TortoiseGit上傳項目到GitHub

1. 簡介 gitHub是一個面向開源及私有軟件項目的托管平臺&#xff0c;因為只支持git 作為唯一的版本庫格式進行托管&#xff0c;故名gitHub。 2. 準備 2.1 安裝git&#xff1a;https://git-scm.com/downloads。無腦安裝 2.2 安裝TortoiseGit(小烏龜)&#xff1a;https://torto…

496. 下一個更大元素 I

496. 下一個更大元素 I 給你兩個 沒有重復元素 的數組 nums1 和 nums2 &#xff0c;其中nums1 是 nums2 的子集。 請你找出 nums1 中每個元素在 nums2 中的下一個比其大的值。 nums1 中數字 x 的下一個更大元素是指 x 在 nums2 中對應位置的右邊的第一個比 x 大的元素。如果…