Qt / PyQt: Низкоуровневая отрисовка текста - PullRequest
0 голосов
/ 08 декабря 2011

[Примечание: я предпочитаю PyQt, но, насколько мне известно, ответ на Qt такой же.Я понимаю оба языка.]

Вопрос:

Я хотел бы отобразить строку, например: 'Hello world !'(ничего фантастического).Я не хочу делать это через прокси, такой как QTextEdit или QWebKit.Скорее, я хочу полный контроль над рендерингом на низком уровне - каждого персонажа.Вопросы / вопросы:

  1. Какой виджет я должен использовать (для быстрого рендеринга) QGraphicsWidget?

  2. Учитывая позицию (x, y)Как мне затем отобразить изображение символа на экране?

  3. Текст может занимать несколько строк.Должен ли я выводить изображение каждого символа на экран один за другим, или я должен сначала создать «изображение» строки, а затем визуализировать каждую строку (я предполагаю, что это помогло бы в скорости прокрутки, посколькупересчитать каждый символ, только переместить строку вверх или вниз)?Если последнее, как мне создать это изображение?

  4. Как бы я выделил выделение, когда пользователь наводит на него указатель мыши - нужно ли мне заново визуализировать символ или простовыполнять какие-либо операции с «фоновым цветом» в этой позиции экрана?

Пожалуйста, я был бы признателен, если бы вы могли ответить практическим способом - т.е. конкретными методами / классами / и т. д.(не просто расплывчатая идея вроде «показать это» - но как?).

Спасибо!

1 Ответ

1 голос
/ 09 декабря 2011

Реализация пользовательского 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
...