• 12741阅读
  • 16回复

子类的widget实现不了paintEvent,怎么回事? [复制链接]

上一主题 下一主题
离线ttth202501
 
只看楼主 正序阅读 楼主  发表于: 2009-02-20
我的程序没用designer设计, 程序的基类叫qtPlayer, 继承于QWidget, 在基类中可以用connect(QTimer , SIGNAL( timeout() ), this, SLOT(update())) 定时器, 可以成功调用paintEvent,.
但现在我做了类, 是qtPlayer的子类,infPlayer, 在这个类中创建了一个widget, 我想在这个widget上面画线,但是执行connect之后, 好象没有执行update(), 因为画面没闪, paintEvent也没有执行. 我在网上看说是基类继承QWidget就可以了, 子类就可以重载paintEvent, 但是我基类继承QWidget了, 但是还是调用不了子类的paintEvent, 这是怎么回事?弄了快一天了, 最好能详细点, 呵呵, 先谢谢大家了~~~
离线jimiwch
只看该作者 16楼 发表于: 2009-12-09
在派生类中重载PaintEvent绘图函数,在其中实现绘图功能,然后new一个该派生类,在需要重绘时会自动调用PaintEvent函数
离线randy
只看该作者 15楼 发表于: 2009-12-09
哎 我也一直在烦这个问题!!
离线浪漫天使
只看该作者 14楼 发表于: 2009-02-23
还有就是 你说

就是在派生类中new一个widget(父窗体是基类的widget),然后用paintEvent在派生类的widget上画一条线就行

这里的 widget 不能new 原始的 QWidget .必须是new你自己派生于 QWidget的类,而且这个派生的类还必须重写了paintEvent.

就是说 这里
QWidget *infWd;
不能是 QWidget,而应该是你派生QWidget 的类。
离线浪漫天使
只看该作者 13楼 发表于: 2009-02-23
connect( infTime, SIGNAL( timeout() ), infWd, SLOT( update() ) );
改成
connect( infTime, SIGNAL( timeout() ), this, SLOT( update() ) );

也不能打印ok么?   
离线ttth202501
只看该作者 12楼 发表于: 2009-02-23
可以调用paintEvent了,我用了构造函数的初始化列表, 比如基类是qtPlayer, 派生类是infPlayer, 初始化infPlayer的时候, 参数是qtplayer的对象, 然后在infPlayer(QWidget *parent) : qtPlayer(parent), 就可以调用paintEvent, 但我还不是很了解为什么这么用, 还有,就是我的线不能完全画上去, 不知道为什么
只看该作者 11楼 发表于: 2009-02-23
在qtPlayer 里声明下paintEvent并且设为虚函数
离线ttth202501
只看该作者 10楼 发表于: 2009-02-22
还不是这个问题啊,各位大侠,help me~~我快愁死了,编个小的测试程序说明一下就行,就是在派生类中new一个widget(父窗体是基类的widget),然后用paintEvent在派生类的widget上画一条线就行,各位大侠,帮帮忙了~~~
离线nmiirq

只看该作者 9楼 发表于: 2009-02-22
7楼的意思是指:声明paintEvent这个函数时,应该是protected函数的....
离线ttth202501
只看该作者 8楼 发表于: 2009-02-22
引用第7楼280923299于2009-02-22 16:17发表的  :
paintEvent是protected函数

能说的详细点吗?那我应该怎么用paintEvent这个函数?
离线280923299
只看该作者 7楼 发表于: 2009-02-22
paintEvent是protected函数
离线ttth202501
只看该作者 6楼 发表于: 2009-02-22
我把我的槽函数换成我自定义的一个函数,简单的输出一句话,可以实现,但就是update()不好用
离线ttth202501
只看该作者 5楼 发表于: 2009-02-22
引用第4楼weizhy于2009-02-22 12:09发表的  :
你的定时器启动的是infWnd的槽,而你真正想要操作的是infWdPlayer,当然不会调用了

我的infWd是个widget,我想在这上面画线,我的接收者是infWdPlayer这个类?那我connect第三个参数是this吗?我改过this,也没好用
离线weizhy
只看该作者 4楼 发表于: 2009-02-22
你的定时器启动的是infWnd的槽,而你真正想要操作的是infWdPlayer,当然不会调用了
离线ttth202501
只看该作者 3楼 发表于: 2009-02-22
我把我的定时器给注释了,换成paintEvent( NULL ); 直接调用,结果输出了“OK???”,所以就应该是我的定时器没有执行update() 这个槽,或者说,定时器不知道update了哪个widget???这是为什么???
离线ttth202501
只看该作者 2楼 发表于: 2009-02-22
class qtPlayer : public QDialog
{   
    Q_OBJECT

public:
    qtPlayer(QWidget *parent = 0);
    virtual ~qtPlayer(){};

    void play( program *, QWidget *parent = 0 );
    void stop();

public:
    baseWdPlayer *bwp;
    QWidget *qtWdPlayer;
};
这是我的基类


class infWdPlayer : public qtPlayer, public baseWdPlayer
{
    Q_OBJECT

public:
    infWdPlayer();

    void play();
    void stop();

    void paintEvent(QPaintEvent *);

public:
    qtPlayer *obj;
    QPainter p;
                      QWidget *infWd;
};
这是我的派生类

void infWdPlayer :: play()
{
                    infWd = new QWidget( obj->qtWdPlayer );  //qtWdPlayer是我的窗口widget
    infTime = new QTimer(this);
    connect( infTime, SIGNAL( timeout() ), infWd, SLOT( update() ) );   

    infTime->start(100);
}


void infWdPlayer :: paintEvent(QPaintEvent *q)
{
    cout << "OK???" << endl;
}

paintEvent没有调用...........play()是通过baseWdPlayer的指针调用的,应该没问题
[ 此贴被ttth202501在2009-02-22 11:10重新编辑 ]
离线nmiirq

只看该作者 1楼 发表于: 2009-02-22
贴些CODE上来吧,应该是程序某些细节方面未处理好!
快速回复
限100 字节
 
上一个 下一个