[注意:我更喜欢PyQt,但就我而言,Qt的答案是一样的。我理解这两种语言。]
问题:
我想渲染一个字符串,例如:'Hello world !' (没有什么花哨)。我不想通过代理执行此操作,例如QTextEdit或QWebKit。相反,我希望在低级别上完全控制渲染 - 每个角色。问题/问题是:
我应该使用哪个小部件(最快的渲染)QGraphicsWidget?
给定位置(x,y),我如何在屏幕上渲染角色的图像?
文字可能跨越多行。我应该逐个将每个角色的图像渲染到屏幕上,还是应该首先创建线条的“图像”,然后渲染每一条线(我认为这有助于滚动的速度,因为没有重新计算每个角色,只是向上或向下移动线)?如果是后者,我该如何创建该图像?
当用户将鼠标拖到它上面时,我将如何突出显示选择 - 我是否需要重新渲染角色,或者只是在屏幕的那个位置做一些“背景颜色”操作?
如果你能以实际的方式回答,我将不胜感激 - 即具体方法/课程/等。 (不仅仅是一个模糊的想法,比如“展示它” - 但是如何?)。
谢谢!
答案 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