Qt4.7 QPainter not active

paintEvent(QPaintEvent*){QPainterpainter(this);//警告:paintershouldbebeginasaresultofpa... paintEvent( QPaintEvent* )
{
QPainter painter( this ); //警告:painter should be begin as a result of paintEvent;
painter.setBrush( Qt::red );//警告:painter not active
painter.drawRect( QRect( 10, 10, 50, 50 ) );
}
使用isActive函数和begin函数测试,结果都是false。
请教问题出在哪里?谢谢
谢谢两位,问题出在viewport()。
再次感谢。
展开
 我来答
mileelove
2012-02-17 · TA获得超过454个赞
知道小有建树答主
回答量:183
采纳率:0%
帮助的人:324万
展开全部
由于QPlainTextEdit继承自QAbstractScrollArea,与普通的直接继承自QWidget的控件存在差异,QAbstractScrollArea中包含一个视窗,该视窗可以通过viewport函数来获取,刚好所有的绘制操作都是在该视窗内部的,所以你应该在视窗内部进行绘制,而不是外围的widget中进行绘制(有点绕,还是看下面的代码)
假设你在头文件有如下定义:
//editor.h
class Editor : public QPlainTextEdit
{
Q_OBJECT

public:
Editor(QWidget* parent = 0):QPlainTextEdit(parent){}
virtual ~Editor(){}
//...
protected:
void paintEvent(QPaintEvent *e);
//..
};

源文件内容如下
void Editor::paintEvent(QPaintEvent *e)
{
//通过viewport函数获取视窗并进行绘制
//我只是简单的填充了一种颜色。
QPainter painter(viewport());
painter.fillRect(rect(),Qt::cyan);

//调用QPlainTextEdit默认的绘制函数,不调用的话
//后果会很严重的。
QPlainTextEdit::paintEvent(e);
}

虽然不明白你为嘛要重载paintEvent不过我想说,如果只是为了更改背景为目的,那还是用style sheet,方便!只要不要求速度,那么就用style sheet
追问
只是想向文本框中输入数据。
我看到Qt自带的例子中也没有在最后加“QPlainTextEdit::paintEvent(e);”。
追答
如果只是为了向文本框中输入数据,用QPlainTextEdit就行了,不用重写paintEvent。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者XXGDQ4kMbU
2012-02-17 · TA获得超过1281个赞
知道小有建树答主
回答量:371
采纳率:66%
帮助的人:426万
展开全部
你是不是在一些像QListView,QTableView,QTreeView或其子类中重载的paintEvent,这些被称为项视图类的类是不能在自己的paintEvent里直接构建QPainter进行绘图的.要借助QDelegate的力量
追问
我是在QPlainTextEdit的子类中重载paintEvent。
追答
void QAbstractScrollArea::paintEvent ( QPaintEvent * event ) [virtual protected]
Reimplemented from QWidget::paintEvent().
This event handler can be reimplemented in a subclass to receive paint events (passed in event), for the viewport() widget.
Note: If you open a painter, make sure to open it on the viewport().
See also QWidget::paintEvent().

QPlainTextEdit 这个类继承于 QAbstractScrollArea 但是为了使绘画达到最优效果不可能每次repaint都把全部内能重新画一遍,而只是画我们看得到的范围.在这里偶们就要使用viewport()函数来返回看得见的widget.再用这个widget来构建一个QPainter.具体写法如下

void myPlainTextEdit::paintEvent(QPaintEvent *e)
{
QPainter painter(this->viewport());
painter.drawRect(10,10,20,20);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式