• 12267阅读
  • 8回复

paintEvent()在窗口部件内画图的问题 [复制链接]

上一主题 下一主题
离线dancyz
 

只看楼主 倒序阅读 楼主  发表于: 2009-08-27
我的主窗体是QWidget,在主窗体内有一个QWidget控件:widget_show。
我想在widget_show里面画图,使用了函数paintEvent()函数;
paintTest.h文件:
class paintTest : public QWidget
{
Q_OBJECT

public:
paintTest(QWidget *parent = 0);
~paintTest();
protected:
void paintEvent(QPaintEvent* event);
public slots:
void start_paint();
void stop_paint();

private:
Ui::paintTestClass ui;
QTimer* paint_timer;
};

paintTest.cpp 文件:
#include "painttest.h"

paintTest::paintTest(QWidget *parent)
: QWidget(parent)

   ui.setupUi(this); 
   paint_timer=new QTimer(this); 

   connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(start_paint())); 
   connect(ui.pushButton_3,SIGNAL(clicked()),this,SLOT(stop_paint())); 
   connect(paint_timer,SIGNAL(timeout()),this,SLOT(update()));
}

paintTest::~paintTest()
{

}

void paintTest::paintEvent(QPaintEvent* event)
{
   QPainter painter(ui.widget_show); 
   cout<<"enter int paintEvent"<<endl; 

   painter.setRenderHint(QPainter::Antialiasing,true); 
   painter.setPen(QPen(Qt::black,6,Qt::DashDotLine,Qt::RoundCap)); 
   painter.setBrush(QBrush(Qt::green,Qt::SolidPattern)); 
   painter.drawEllipse(20,20,100,50);
}

void paintTest::start_paint()
{

   cout<<"start_paint!"<<endl;
   paint_timer->start(1000);
  cout<<"timer is up"<<endl;

}
void paintTest::stop_paint()
{
    cout<<"stop paint!"<<endl;
    paint_timer->stop();
    cout<<"timer is stop"<<endl;
}

上面的代码在运行时,paintEvent()事件可以触发,但是不能画出图。

如果红色标记的语句换成:
QPainter painter(this);
那么在主窗体就可以画出图了。。

但是我不想在主窗体中画图,只想在widget_show里画,各位大虾有没有什么建议?在这里谢过各位了呀。
 

离线dbzhang800

只看该作者 1楼 发表于: 2009-08-27
引用楼主dancyz于2009-08-27 20:39发表的 paintEvent()在窗口部件内画图的问题 :
但是我不想在主窗体中画图,只想在widget_show里画,各位大虾有没有什么建议?在这里谢过各位了呀。
.......


你想在 widget_show 里画,你就该子类化这个类,然后重载它的paintEvent()
离线jorneyr

只看该作者 2楼 发表于: 2009-08-27
使用事件过滤器可以实现在widget_show里画图, 如
ui->yearWidget->installEventFilter(this);


bool StatisticsDialog::eventFilter(QObject *watched, QEvent *e) {
    if (watched == ui->yearWidget) {
        if (e->type() == QEvent::Paint) {
            paintYeatWidget();
            return true;
        }
    } else if (watched == ui->monthWidget) {
        if (e->type() == QEvent::Paint) {
            paintMonthWidget();
            return true;
        }
    }

    return QDialog::eventFilter(watched, e);
}


void StatisticsDialog::paintYeatWidget() {
    QPainter painter(ui->yearWidget);
    ..............
}
离线dancyz

只看该作者 3楼 发表于: 2009-08-28
to   dbzhang800
先谢谢你的答复,呵呵

今天我也是想用这种方法:
具体的实现方法就是将widget_show封装成一个类,在这个类里重载paintEvent()函数,再把这个类加载到主窗体的一个widget控件里,widget_show这个类中的界面元素可以显示出来,但是触发不了widget_show中的paintEvent()事件,甚至widget_show中的按钮事件都不能触发,是什么原因呢?
正在焦虑中哪。。
离线dancyz

只看该作者 4楼 发表于: 2009-08-28
引用第2楼jorneyr于2009-08-27 22:47发表的  :
使用事件过滤器可以实现在widget_show里画图, 如
ui->yearWidget->installEventFilter(this);
bool StatisticsDialog::eventFilter(QObject *watched, QEvent *e) {
.......


谢谢 jorneyr  的回复。。
我对事件过滤器不是太熟悉,恩。。这个方法我会试一试的。。谢谢

还有 想再请教个问题,
就是 这个 paintEvent()函数是在什么情况下触发的呢?
我现在知道的是在窗体show()的时候触发和被update(),repaint()函数触发,在其他情况下会触发么?
因为我发现有些情况下会不停的进入paintEvent()函数。。请各位大虾指教。。
离线dancyz

只看该作者 5楼 发表于: 2009-08-28
问题解决了。。谢谢各位大虾。。
现在可以在主窗体上显示子类化的widget_show

额。。
就是那个子类需要手动show()或者new的时候指定其父控件。。


但是paintEvent()还是会不停的触发,而不是随着timer的start()和stop来控制。。
离线jerychang
只看该作者 6楼 发表于: 2010-04-18
dancyz

我遇到了和你同样的问题,可是新的问题出现了。
QT HAO..
离线liukang325

只看该作者 7楼 发表于: 2012-03-16
回 5楼(dancyz) 的帖子
你是怎么解决这个问题的?能否给点实际的例子。。我现在也遇到这个问题不知道怎么实现……谢啦
离线liukang325

只看该作者 8楼 发表于: 2012-03-16
回 5楼(dancyz) 的帖子
快速回复
限100 字节
 
上一个 下一个