• 13442阅读
  • 13回复

为什么没有执行paintevent这个函数? [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-18
关键词: 初学者的问题

#include "mainwindow.h"
#define cout qDebug()


test :: test(QMainWindow *parent) : QMainWindow(parent)
{


    setGeometry(320,320,320,320);


    mywidget = new QWidget;
    mywidget->setGeometry(320,320,320,320);
    setCentralWidget(mywidget);


    newaction = new QAction(tr("New Game"),this);
    connect(newaction,SIGNAL(triggered()),this,SLOT(newdraw()));


    aboutaction = new QAction(tr("About"),this);
    connect(aboutaction,SIGNAL(triggered()),this,SLOT(about()));


    filemenu = menuBar()->addMenu(tr("File"));
    filemenu->addSeparator();
    filemenu -> addAction(newaction);


    aboutmenu = menuBar()->addMenu(tr("About"));
    aboutmenu->addSeparator();
    aboutmenu->addAction(aboutaction);
    Test = new QPushButton(tr("aa"),this);
    connect(Test,SIGNAL(clicked()),this,SLOT(newdraw()));
    Test->setGeometry(32,32,32,32);


    isdraw = false;
    memset(arrmap,0,sizeof(arrmap));
    photolist.clear();
    for(int i = 1 ; i <= 5; i++)
    {
        QString phname = ":/image/"+QString::number(i,10)+".gif";
        QPixmap pixmap(phname);
        photolist.append(pixmap);
    }
}


void test:: newdraw()
{
    isdraw =  true;
    update();
}


void test :: paintevent(QPaintEvent */*event*/)
{
    cout << "@@@@@@@@@@@@@@@@@";// 没有运行
    if(!isdraw) return;
    QPainter painter(this);
    for(int i = 1; i <= 8; i++)
    {
        for(int j = 1 ; j <= 8; j++)
        {
            arrmap[j] = rand() % 5;
        }
    }
    for(int i = 1; i <= 8; i ++)
    {
        for(int j =1; j <= 8; j++)
        {
            painter.drawPixmap((j-1)*(32),(i-1)*(32),32,32,photolist.at(arrmap[j]));
        }
    }
    painter.drawEllipse(32,32,32,32);
    update();
}
只看该作者 1楼 发表于: 2011-06-18
为什么 paintevent这个函数没有被调用?
只看该作者 2楼 发表于: 2011-06-18
发现一个论坛bug。。 我的代码 斜体之前是arrmap[j]  ... 导致了斜体字。。  
只看该作者 3楼 发表于: 2011-06-18
。。。。。"arrmap[j]"  “”这里导致斜体
只看该作者 4楼 发表于: 2011-06-18
好吧。。只能 arrmap【i】了。。
只看该作者 5楼 发表于: 2011-06-18
[kadfasdfasd] test
只看该作者 6楼 发表于: 2011-06-18
[a]  test
离线dbzhang800

只看该作者 7楼 发表于: 2011-06-18
1. 没被调用是因为拼写错误,C、C++ 是区分大小写的!!

2. 如果你写对了,它会被调用。但是!你不应该这么用,不要覆盖QMainWindow 的paintEvent函数!!。(除非你非常清楚你在做什么)
只看该作者 8楼 发表于: 2011-06-18
回 7楼(dbzhang800) 的帖子
(⊙o⊙)… 我的函数名字都是paintevent 。 现在改成paintEvent了,能行了>< 。 但是能不能解释下原因,多谢
离线dbzhang800

只看该作者 9楼 发表于: 2011-06-18
Re:回 7楼(dbzhang800) 的帖子
引用第8楼做个小计划于2011-06-18 18:40发表的 回 7楼(dbzhang800) 的帖子 :
(⊙o⊙)… 我的函数名字都是paintevent 。 现在改成paintEvent了,能行了>< 。 但是能不能解释下原因,多谢[表情]  

你可以想想成QWidget 是一个白板,所以你可以随便画。

QMainWindow是其派生类,当然也是一个白板,既然派生,肯定又不同。它是用来放置其他白板的(QMenuBar/QToolBar/QDockWidget/中心Widget/QStatusBar)

即使你在它上面画出来“蒙娜丽莎”级别的作品,可是别人看到的还是 你放置的工具栏、状态栏、...这些东西(除非你让他们透明,或者直接不要这些东西)
只看该作者 10楼 发表于: 2011-06-18
Re:Re:回 7楼(dbzhang800) 的帖子
引用第9楼dbzhang800于2011-06-18 18:56发表的 Re:回 7楼(dbzhang800) 的帖子 :
你可以想想成QWidget 是一个白板,所以你可以随便画。
QMainWindow是其派生类,当然也是一个白板,既然派生,肯定又不同。它是用来放置其他白板的(QMenuBar/QToolBar/QDockWidget/中心Widget/QStatusBar)
.......

是说要画蒙娜丽莎之类的东西就只能重新从QWidget哪里派生一个白板,而不能在QMainWindow上画?  
现在又遇到问题是在QMainWindow类上图片没有画出来,是这个问题的缘故?
离线diyuanbo

只看该作者 11楼 发表于: 2011-06-19
想问问楼主,为什么编译器会平白无故的要让paintevent得到执行,难道因为paintevent和paintEvent长的很像吗?

dbzhang800说的很对"C、C++ 是区分大小写的".
楼主的test类并未重新实现void QWidget::paintEvent ( QPaintEvent * event )虚函数.
所以void test:: newdraw()中执行 update()时会自动执行缺省的QWidget::paintEvent函数.
和楼主的paintevent没什么关系.
只看该作者 12楼 发表于: 2011-06-19
引用第11楼diyuanbo于2011-06-19 11:55发表的  :
想问问楼主,为什么编译器会平白无故的要让paintevent得到执行,难道因为paintevent和paintEvent长的很像吗?
dbzhang800说的很对"C、C++ 是区分大小写的".
楼主的test类并未重新实现void QWidget::paintEvent ( QPaintEvent * event )虚函数.
所以void test:: newdraw()中执行 update()时会自动执行缺省的QWidget::paintEvent函数.
.......

我才第二次用这个函数,根本就没了解到这么多,谢谢两位的解释~~  


我C++也就算是个零了解。 目前为止写的代码基本都是纯C的...
离线古道瘦鱼

只看该作者 13楼 发表于: 2016-05-24
昨天才碰到这个问题,看了一下这是11年的贴,学长现在肯定是大手了
快速回复
限100 字节
 
上一个 下一个