Qt QRect 解决获取顶点坐标不准的问题

本文介绍在Qt中使用QRect时遇到的一个问题:通过构造函数创建的矩形,在获取左下角坐标时可能出现不准确的情况。文章提供了一个解决方案,即通过计算矩形中心点并结合宽度和高度的绝对值来获取正确的左下角坐标。

Qt QRect 解决获取顶点坐标不准的问题

项目上用到了手动绘制矩形的功能 ,然后要在矩形的左下角绘制文字

构造矩形的时候用的这个构造函数

QRect(const QPoint &topLeft, const QPoint &bottomRight)

有个问题,用户画矩形的时候不是总是从左上角往右下角画的,往任意方向画,调用了QRect的接口获取左下角后,并不能真实的返回"左下角"的坐标

QPoint QRect::bottomLeft() const

后来查看qt的官方帮助文档,上面显示由于历史原因,并不能真正的返回形如左下角、右下角之类的坐标。

### QT 获取窗口左上角坐标的方法 在Qt中,获取窗口左上角坐标解决方案可以通过多种方式实现。以下是几种常见的方法及其解释: 1. **使用 `pos()` 方法** 每个继承自 `QWidget` 的类都提供了一个 `pos()` 方法,该方法返回窗口或控件在其父窗口中的位置。如果窗口没有父窗口,则返回的是窗口相对于屏幕的位置[^3]。 ```cpp QPoint topLeft = this->pos(); // 获取窗口左上角坐标 qDebug() << "窗口左上角坐标: (" << topLeft.x() << ", " << topLeft.y() << ")"; ``` 2. **使用 `geometry()` 方法** `geometry()` 方法返回一个 `QRect` 对象,该对象包含了窗口的几何信息(包括位置和大小)。通过访问 `QRect` 的 `x()` 和 `y()` 方法可以得到窗口左上角的坐标[^5]。 ```cpp QRect rect = this->geometry(); // 获取窗口的几何信息 int x = rect.x(); // 左上角 x 坐标 int y = rect.y(); // 左上角 y 坐标 qDebug() << "窗口左上角坐标: (" << x << ", " << y << ")"; ``` 3. **使用 `frameGeometry()` 方法** `frameGeometry()` 方法返回窗口框架的几何信息,包括边框的宽度。与 `geometry()` 不同的是,它考虑了窗口的装饰部分(如标题栏)[^4]。 ```cpp QRect frameRect = this->frameGeometry(); // 获取窗口框架的几何信息 int fx = frameRect.x(); // 窗口框架左上角 x 坐标 int fy = frameRect.y(); // 窗口框架左上角 y 坐标 qDebug() << "窗口框架左上角坐标: (" << fx << ", " << fy << ")"; ``` 4. **通过桌面计算窗口中心并推导左上角** 如果需要根据窗口的中心位置推导出左上角坐标,可以通过以下代码实现[^1]: ```cpp QRect screenGeometry = QGuiApplication::primaryScreen()->geometry(); // 获取屏幕几何信息 int centerX = (screenGeometry.width() - this->width()) / 2; // 窗口中心 x 坐标 int centerY = (screenGeometry.height() - this->height()) / 2; // 窗口中心 y 坐标 int left = centerX - this->width() / 2; // 推导左上角 x 坐标 int top = centerY - this->height() / 2; // 推导左上角 y 坐标 qDebug() << "窗口左上角坐标: (" << left << ", " << top << ")"; ``` 以上方法均适用于不同的场景需求。开发者可以根据具体的应用环境选择最适合的方式。 ```cpp #include <QApplication> #include <QWidget> #include <QPoint> #include <QRect> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(300, 200); window.show(); // 使用 pos() 方法 QPoint topLeft = window.pos(); qDebug() << "窗口左上角坐标 (pos):" << topLeft; // 使用 geometry() 方法 QRect rect = window.geometry(); qDebug() << "窗口左上角坐标 (geometry):" << rect.x() << "," << rect.y(); // 使用 frameGeometry() 方法 QRect frameRect = window.frameGeometry(); qDebug() << "窗口左上角坐标 (frameGeometry):" << frameRect.x() << "," << frameRect.y(); return app.exec(); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值