Cuipo中文是什么:Qt中文本的定位规则到底是什么

这是一段非常基本的代码:

测量一段文本的大小。

在坐标 (100,25) 处绘制与此大小相对应的矩形。

在坐标 (100,25) 处显示文本。

auto str = "Hello, World!";
auto metrix = window->fontMetrics();
auto text = scene->addText(str);
text->setPos(100, 25);
text->setDefaultTextColor(Qt::white);
auto r = metrix.boundingRect(str);
int x, y, w, h;
r.getRect(&x, &y, &w, &h);
scene->addRect(100, 25, w, h, QPen(Qt::white));

代码中的scene是一个QGraphicsScene,没有特定的自定义,除了边框设置为零。

我希望文本正好在矩形内。然而,文本向左移动了几个像素,向底部移动了几个像素。为什么?

enter image description here

3

解决方案

如 @ NgocMinhNguyen 建议的那样,将文档边距设置为0似乎可行,但这不是真正的解决方案,因为您会丢失边距。如果您可以获得实际的几何形状,包括边距等,那会更好。为此,您可以使用QGraphicsTextItem::boundingRect()而不是QFontMetrics::boundingRect

实例

这是我为您编写的一个最小且完整的示例,以演示建议的解决方案:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QBoxLayout>
struct MainWindow : public QWidget
{
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        QPointF p(100, 25);
        auto *l = new QVBoxLayout(this);
        auto *view = new QGraphicsView(this);
        auto *textItem = new QGraphicsTextItem(tr("HHHHHHHH"));
        auto *rectItem = new QGraphicsRectItem(textItem->boundingRect()
                                               .adjusted(0, 0, -1, -1));
        textItem->setPos(p);
        rectItem->setPos(p);
        view->setScene(new QGraphicsScene(this));
        view->scene()->addItem(textItem);
        view->scene()->addItem(rectItem);
        l->addWidget(view);
        resize(300, 300);
    }
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.sw();
    return a.exec();
}

注意:请注意我是如何创建矩形的,两者之间是有区别的

auto *item = new QGraphicsRectItem(100, 25, w, h);

auto *item = new QGraphicsRectItem(0, 0, w, h);
item->setPos(100, 25);

后果

此示例生成以下结果:

Text in a bounding rectangle

2

QGraphicsTextItemQTextDoent持有,它可以有一个margin
将边距设置为 0,将正确绘制矩形。

text->doent()->setDoentMargin(0);

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(813)
鲜柚生活小程序:Java小程序 vs应用程序
上一篇
Ck皮带尺寸:CK可以有一个FK引用另一个表中的CK吗
下一篇

相关推荐

  • comeandgetyourlove音乐爱就在你身边

    Come and Get Your Love是一首热门的歌曲,由美国摇滚乐队Redbone演唱。这首歌曲于1974年发行,被收录在他们的专辑《Wovoka》中。歌曲以放克曲风为主,旋律活泼,曲调悠扬,歌词朗朗上口,深受歌迷喜爱。…

    2023-06-29 07:47:31
    0 21 12
  • codeblocks无法编译运行:Codeblocks无法编译运行的解决方案

    codeblocks无法编译运行的原因可能有很多,下面以一段简单的C语言代码为例,来说明codeblocks无法编译运行的情况。…

    2023-07-11 08:01:55
    0 65 29
  • gitlab ci 自动化部署:使用 Gitlab CI 自动化部署提升开发效率

    GitLab CI 自动化部署是一种基于 GitLab CI/CD 的自动化部署方案,可以实现快速、可靠的部署流程。它将代码提交、构建、测试、部署等步骤集成在一起,使得开发者可以更加轻松地完成部署工作。下面是一个示例 .gitlab-ci.yml 文件,可以帮助你实现 GitLab CI 自动化部署:…

    2023-05-20 05:45:38
    0 43 85
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-05-16 07:36:03
    0 73 42
  • js添加css:This is a Title

    使用js添加css可以通过修改元素的style属性来实现,具体代码如下:…

    2023-05-27 12:30:24
    0 70 80
  • css 字符间距:### 世界上最美的地方

    示例示例CSS 字符间距是指在文本中的字符之间添加间距,以增强文本的可读性。它可以使文本更容易阅读,也可以使文本看起来更美观。代码示例:…

    2023-04-15 08:45:29
    0 21 78
  • git 删除commit记录:回滚Git Commit记录

    git删除commit记录可以使用git reset命令。使用方法:…

    2023-07-07 04:31:44
    0 69 69
  • java实现tcp:使用Java实现TCP网络编程

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它使用三次握手来建立可靠的连接,并且在数据传输期间可以检测丢失的数据包并重新发送。…

    2023-01-31 10:33:14
    0 11 91

发表评论

登录 后才能评论

评论列表(57条)