Qt / PyQt:低级文本呈现

时间:2011-12-08 10:55:22

标签: python qt text pyqt rendering

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

问题:

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

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

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

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

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

  5. 如果你能以实际的方式回答,我将不胜感激 - 即具体方法/课程/等。 (不仅仅是一个模糊的想法,比如“展示它” - 但是如何?)。

    谢谢!

1 个答案:

答案 0 :(得分:1)

通过重载QWidget并使用画家来实现自定义QWidget::paintEvent是使用窗口小部件系统在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