• 4652阅读
  • 4回复

关于背景图和paintEvent()的问题 [复制链接]

上一主题 下一主题
离线wangjuns8
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-18
我用的qt环境是qt3.3.8,fadora8的系统。刚学习qt不久,遇到一个很郁闷的问题,请高手们解答。

代码如下:
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qpixmap.h>

class MyButton : public QWidget
{
public:
MyButton( QWidget *parent=0, const char *name=0 );

protected:
void paintEvent( QPaintEvent *);

private:
QLabel *label;
};

MyButton::MyButton( QWidget *parent, const char *name )
: QWidget( parent, name )
{
label = new QLabel( "label", this, "label" );
QVBoxLayout *box = new QVBoxLayout(this);
box->addWidget(label);
}

void MyButton::paintEvent( QPaintEvent *e)
{
qDebug("BPixmapButtonBase::paintEvent");
}

class MyWidget : public QWidget
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
};

MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name )
{
MyButton *btn = new MyButton(this, "label" );
btn->repaint(); //还试过update();都没有效果
}

int main( int argc, char **argv )
{
QApplication a( argc, argv );

MyWidget w;
w.resize(200, 120);
QPixmap pix("images/ground1.png");
w.setPaletteBackgroundPixmap(pix);
a.setMainWidget( &w );
w.show();
return a.exec();
}
若去掉w.setPaletteBackgroundPixmap(pix);这句,或是换成w.setBackgroundPixmap(pix);则MyButton::paintEvent()不会被调用。到底有什么联系呢?好像跟palette有关,因为不想用setPaletteBackgroundPixmap()所以很想知道为什么。

先谢了!
离线wangjuns8
只看该作者 1楼 发表于: 2009-12-21
像这样,在MyWidget构造函数里加入下面代码:
QVBoxLayout *box = new QVBoxLayout(this);
QPushButton *pbtn = new QPushButton("button", this, "butn");
connect(pbtn, SIGNAL(clicked()), btn, SLOT(repaint()));//这里用update()也可以
box->addWidget(pbtn);
box->addWidget(btn);
当按钮按下时,则会调用paintEvent(),我就是不明白,为什么在构造函数里调用不好使,等界面出来了再调用就可以了,是不是内部有个什么机制屏蔽了paintEvent(),但是加上主页面的setPaletteBackgroundPixmap()就会调paintEvent()了,这里面有什么联系呢?
离线benbenmajia

只看该作者 2楼 发表于: 2009-12-21
问题应该再这里,你再程序中得主窗口在MYWIDGET中而不是在button中,如果你想要看到painter得效果那么应该把paint事件放到mywidget中实现,你可以试下效果,也可以利用多线程在button中一起paint,具体我也没有试,你可以试一下
安然.....
离线wangjuns8
只看该作者 3楼 发表于: 2009-12-21
呵呵,果然,我在MyWidget里也定义piantEvent事件之后,在里面调用btn->repaint()或btn->update()都是好使的。虽然还没太明白和setPaletteBackgroundPixmap()的关系,但应经知道怎么用了

多谢,benbenmajia
离线benbenmajia

只看该作者 4楼 发表于: 2009-12-21
不谢,英爱得
安然.....
快速回复
限100 字节
 
上一个 下一个