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()。
再次感谢。 展开
{
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()。
再次感谢。 展开
2个回答
展开全部
由于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
假设你在头文件有如下定义:
//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。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是不是在一些像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);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询