什么是屏幕分辨率
我们手机,平板,个人台式机显示器,笔记本显示器家里的液晶电视显示器在显示画面的时候,都是由一个一个的像素点组成的。
不同的像素点显示不同的颜色,整个屏幕就会出现画面。
像素点的排列
显示器的像素点是水平垂直挨个排列的。
像收集屏幕,像素分辨率高,点密集,我们肉眼很难看到有一个一个的像素单元在屏幕上。
如果是笔记本电脑,我们把一个汉字截图,放大,就会发现这个汉字周围不是圆滑的,而是锯齿的:
上图是我的笔记本对屏幕局部截图再放到后的效果。
可以明显的看出汉字是由一些不同颜色的点排列而成。这些点就是像素点。
屏幕分辨率
一般来说,常见的屏幕分辨率长宽比都是16:9。这是因为人眼看到的外部世界的视角大致就是这么一个比例的长方形。所以这样的屏幕分辨率,人眼看着舒服一些。
常见的屏幕分辨率有:1920x1080 水平方向1920个像素点,垂直方向1080个像素点。
4K 画面:1920*2 x 1080*2 即 3840x2160。
Qt测量屏幕的分辨率
Qt程序在定位界面位置的时候,会使用x,y 两个坐标来描述屏幕上的一个位置。单位就是像素。
我们可以把鼠标位置绘制在窗口上,当鼠标移动的时候,就可以发现各个位置的屏幕坐标。
同时,我们把窗口的大小一开始就显示出来。这样随着我们移动鼠标,就可以直观的感受到像素位置和屏幕分辨率的含义。
Qt 程序
下面的程序就是完成这个功能的,当我们执行的时候,程序唯一的窗口会全屏显示(按 escape 键退出全屏)。
显示屏幕的分辨率,和鼠标的位置:
可以看出我的笔记本电脑的屏幕分辨率为:1920x1080。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QColor>
#include <QString>
#include <QKeyEvent>
#include <iostream>
using namespace std;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
//绘制窗口内容,包括窗口大小和鼠标位置
void paintEvent(QPaintEvent* painter1) override;
//鼠标移动事件,获取鼠标位置
void mouseMoveEvent(QMouseEvent* event);
//绘制窗口大小,宽度和高度
void drawSize(void);
//绘制鼠标位置,位置由鼠标移动事件获得
void drawMouse();
//按F12在全屏和正常模式之间切换
void keyPressEvent(QKeyEvent* event) override;
private:
Ui::MainWindow *ui;
//存放鼠标移动的当前位置,在鼠标移动事件中修改该位置
QPoint m_mousePos;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QDesktopWidget>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
auto t = (QMainWindow*)this;
t->centralWidget()->setMouseTracking(true);
this->setMouseTracking(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
inline void MainWindow::paintEvent(QPaintEvent* painter1)
{
drawSize();
drawMouse();
}
void MainWindow::mouseMoveEvent(QMouseEvent* event)
{
m_mousePos = event->pos();
update();//repaint
}
void MainWindow::drawMouse()
{
QPainter painter(this);
auto w = this->geometry().width();
auto text = "mouse=" + std::to_string(m_mousePos.x() + 1) + "," + std::to_string(m_mousePos.y() + 1);
painter.drawText(QPoint(10, 15), QString(text.c_str()));
}
void MainWindow::keyPressEvent(QKeyEvent* event)
{
if (event->key() == Qt::Key_Escape)
{
showNormal();
}
update();//repaint
}
void MainWindow::drawSize(void)
{
int left = 10;
int row = 40;
int row_height = 15;
int row_index = 1;
QPainter painter(this);
painter.drawText(QPoint(left, row), QString(("Window width=" + std::to_string(width())).c_str()));
painter.drawText(QPoint(left, row + row_height * row_index++), QString(("Window height=" + std::to_string(height())).c_str()));
painter.drawText(QPoint(left, row + row_height * row_index++), QString("desktop width=") + QString::number(QApplication::desktop()->width()));
painter.drawText(QPoint(left, row + row_height * row_index++), QString("desktop height=") + QString::number(QApplication::desktop()->height()));
}
程序源码下载:
QScreenSize · CalmReason/learn-qt-with-code - 码云 - 开源中国 (gitee.com)