【问题标题】:Qt / PyQt: Low level text renderingQt / PyQt:低级文本渲染
【发布时间】:2011-12-08 10:55:21
【问题描述】:

[注意:我更喜欢 PyQt,但就我而言,Qt 的答案是一样的。我懂两种语言。]

问题:

我想渲染一个字符串,例如:'Hello world!' (没有什么花哨)。我不想通过代理来执行此操作,例如 QTextEdit 或 QWebKit。相反,我希望完全控制低级别的渲染 - 每个字符。问题/问题是:

  1. 我应该使用哪个小部件(为了最快的渲染)QGraphicsWidget?

  2. 给定一个位置 (x,y),然后如何在屏幕上渲染角色的图像?

  3. 文本可能跨越多行。我应该将每个字符的图像逐个渲染到屏幕上,还是应该首先创建行的“图像”,然后渲染每一行(我认为这将有助于滚动速度,因为不会重新计算每个字符,只向上或向下移动线)?如果是后者,我该如何创建该图像?

  4. 当用户将鼠标拖到选择上时,我将如何突出显示选择 - 我是否必须重新渲染角色,或者只是在屏幕的该位置执行一些“背景颜色”操作?

如果您能以实用的方式回答,我将不胜感激 - 即特定的方法/类/等。 (不仅仅是一个模糊的想法,比如“展示它”——而是如何展示它?)。

谢谢!

【问题讨论】:

  • 里面有 11 个问号。同时要回答很多问题。如果您尝试首先关注一个问题,例如,您可能会更成功地获得有用的答案。如何渲染单个字符。一旦你能够做到这一点,你可以提出进一步的问题,比如让它斜体或如果你卡住了渲染的性能。
  • 明白。我现在已将其范围缩小到选择渲染方法时必须考虑的最基本问题。
  • 如果您提出具体问题并提供不起作用的代码示例,则更容易给出“实用”的答案。否则,您可能会要求人们为您编写所有代码。
  • 既然skyhisi这么好心的为我提供了基本的出发点,当然我会自己写代码,也可以提出更尖锐的问题。直到现在,我什至不知道从哪里开始!

标签: python qt text pyqt rendering


【解决方案1】:

通过重载QWidget::paintEvent 并使用painter 来实现自定义QWidget 大约是Qt 中使用小部件系统的最低级别。

这是我为您整理的使用 C++ 的完整工作示例,我不知道 PyQt,但希望您可以移植它!

widget.h

#ifndef _WIDGET_H_
#define _WIDGET_H_

#include <QtGui>

class CustomPaint : public QWidget
{
    Q_OBJECT
    protected:
        virtual void paintEvent(QPaintEvent* event);
};

#endif

widget.cpp

#include "widget.h"

void CustomPaint::paintEvent(QPaintEvent* ev)
{
    QPainter painter(this);
    painter.setClipRect(ev->rect());
    painter.fillRect(ev->rect(), Qt::white);

    const int x = 10;
    const int y = 10;
    const int w = width() - 20;
    const int h = height() - 20;

    painter.setPen(QPen(QBrush(Qt::red), 0.0, Qt::DashLine));
    painter.drawRect(x, y, w, h);

    painter.setPen(QPen(QBrush(Qt::black), 0.0, Qt::SolidLine));
    painter.drawText(x, y, w, h,
        Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap,
        tr("Hello World"));
}

test.cpp

#include <QtGui>
#include "widget.h"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    CustomPaint win;
    win.show();

    return app.exec();
}

test.pro

QT=core gui
HEADERS=widget.h
SOURCES=test.cpp widget.cpp

【讨论】:

  • 谢谢!这为我提供了一些关于需要使用哪些类和方法的良好背景信息。现在我所要做的就是根据我的需要玩弄他们的细节。 (根据 ekhumoro 对该问题的评论,我非常感谢您花时间回答这个问题,如果您觉得我是在要求您编写我的代码,我深表歉意。我只是在寻找您提供的基本起点。)
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多