• 10420阅读
  • 7回复

【提问】搞不懂这个Q_OBJECT问题 [复制链接]

上一主题 下一主题
离线rogi1126
 

只看楼主 倒序阅读 楼主  发表于: 2005-10-18
我在一个PictureList类里加上Q_OBJECT
这句话就出现下面的错误: 可是不加就没问题,这是为什么阿?
请各位指教




photo.o(.text+0x111e): In function `main':
: undefined reference to `vtable for PictureList'
photo.o(.text+0x1128): In function `main':
: undefined reference to `vtable for PictureList'
photo.o(.text+0x1251): In function `main':
: undefined reference to `vtable for PictureList'
photo.o(.text+0x125b): In function `main':
: undefined reference to `vtable for PictureList'
collect2: ld returned 1 exit status
make: *** [photo] Error 1
[ 此贴被XChinux在2005-10-18 20:07重新编辑 ]
离线XChinux

只看该作者 1楼 发表于: 2005-10-18
你的信息不完全,把你的相关源代码帖上来啊
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线rogi1126

只看该作者 2楼 发表于: 2005-10-19
还要问一个问题,为什么我在这个类里实现的keyPressEvent,ImageorDir ,set buttonpixmap,都没作用,实际调用的是ScanList 里的虚函数???

源码:

#include "/root/subclass/scanlist.h"
#include <qscrollview.h>
#include <qapplication.h>

class PictureList: public ScanList
{
// Q_OBJECT      ///就是这句话加了就出错
     public :      
           PictureList(QWidget* parent=0, const char* name=0, WFlags f=Qt::WStyle_Customize | Qt::WStyle_NoBorder )
              :ScanList( parent, name, f )
           {
              // create the picture view
           pictureView = new QScrollView( this );
           pictureView->setGeometry(0, 0, 320, 240);
           pictureView->viewport()->setBackgroundColor( blue );
           
           viewLabel = new QLabel( pictureView->viewport() );
           pictureView->addChild(viewLabel);
           pictureView->hide();
           image_flag = 0; // single view flag is initialise to zero
           size = 0;            
            }
      virtual void setButtonPixmap( MPushButton1 *b1, unsigned int index );
      virtual bool isImageOrDic( QString tmpName );
protected :
      virtual void keyPressEvent( QKeyEvent *e );
private :
     void singleView();
     void GetZoom_orign();
     void GetZoom_standard();
     void zoomIn();
     void zoomOut();
     void FitSize();
     void SetPosition();
     QScrollView            *pictureView;
     QLabel                  *viewLabel;
     QPixmap                  map;
     QPixmap                  pixmap;
     QImage                  image;
     
     bool            image_flag;
     int                  size;
     unsigned int      orign_w;
     unsigned int      orign_h;
     unsigned int      zoom_w;
     unsigned int      zoom_h;
     unsigned int      stard_w;
     unsigned int      stard_h;
     bool                  fat_flag;
     
};

void PictureList::keyPressEvent( QKeyEvent *e )
{

  if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Down )
  {
           if( image_flag )
           {
                 pictureView->scrollBy(0,15);
           }
           else
                 DownPressEvent( );
           
  }
  else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Up )
  {
           if( image_flag )
           {
                 pictureView->scrollBy(0,-15);
           }
           else
                 UpPressEvent( );
  }
  else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Left )
  {
           if(image_flag)
                 pictureView->scrollBy(-15,0);
       else
                 LeftPressEvent();
     }
  else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Right )
  {
           if(image_flag)
                 pictureView->scrollBy(15,0);
       else
                 RightPressEvent();
  }      
     else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Return )
  {
//        printf("go to return\n");
           if(image_flag)
           {      
                 pictureView->hide();
                 image_flag = 0;
           }      
           else
           {            
                 if( pHandle[handleX][handleY]->isDir )
                 {
                       ScanDir();
                 }
                 else
                       singleView();
           }
     }
  else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Minus )
  {
           if( image_flag )
           {
                 printf("zoomin key press\n");
                 zoomIn();
           }
           else
           {      
/*                  if(current_page > 0 )
                       GetPixmap( --current_page );      
             else
                       GetPixmap( current_page = page_count-1 );
                 for( unsigned int i=0;i<image_count;i++ )
                       free(namelist);
                 free(namelist);
*/                  qApp->quit();                  
           }
     }
  else if( ( ( QKeyEvent * )e )->key( ) == Qt::Key_Equal )
  {
           if( image_flag )
                 zoomOut();
           else
           {      
                 if(current_page < page_count-1 )
                       GetPixmap( ++current_page );      
             else
                       GetPixmap( current_page = 0 );
           }
           
  }                        
  else
  {
           e->ignore();
  }  
}


bool PictureList::isImageOrDic( QString tmpName ) //check the filename is dir or image file?
{
     printf( "hahaahalololo\n" );
     struct stat tmpstat;
     char tmpchar[200];
     
     strcpy(tmpchar,scan_dir );
//      printf("tmpChar is ....%s\n",tmpchar);
     strcat(tmpchar,"/");
     strcat(tmpchar,tmpName);
     printf("tmpChar is..........%s\n",tmpchar);
     lstat(tmpchar,&tmpstat);
     if(S_ISDIR( tmpstat.st_mode )) //check if or not dir
     {
           printf("is dir:%s\n",tmpchar);
           if(!strcmp(tmpName,".")||!strcmp(tmpName,"..")) //omit the . and .. dir
                 return 0;
           else
                 return 1;
     }
     tmpName = tmpName.right(5);
     if( tmpName.contains(".jpg")||tmpName.contains(".jpeg") //check if or not image file
      ||tmpName.contains(".png")||tmpName.contains(".gif")
      ||tmpName.contains(".bmp")||tmpName.contains(".xpm"))      
           return 1;      
     else
           return 0;
}

void PictureList::singleView( )
{
     current_image = current_page *6+handleY*3+handleX;
     strcpy( nameString, scan_dir );
     sprintf(nameString, "%s/%s",nameString, fileNameList.at(current_image));

     printf( "current image name is -------------%s\n",nameString );
     image.load(nameString);
     FitSize();
     image_flag = 1;
     size = 0; // reset the size to zero in new picture
}

void PictureList::FitSize( )// adjust the size and position in scrollview
{
     pictureView->moveChild( viewLabel,0,0 );
     pictureView->setContentsPos( 0,0 );
     orign_w = image.width();
     orign_h = image.height();
     size=1;
     double w_scale=orign_w/315.0;
     double h_scale=orign_h/237.0;
     double scale = w_scale>h_scale?w_scale:h_scale;
     if(scale>1)
           fat_flag=1;
     else
           fat_flag=0;
     stard_w = (unsigned int)(orign_w/scale);
     stard_h = (unsigned int)(orign_h/scale);
     //      viewLabel->setPixmap( pixmap );
     zoomIn();
     pictureView->show(); //after set the position ,show the picture
}

void PictureList::zoomIn()// shear the image
{
     if (size<=-5)
           return;
     size--;
     printf("zoomin move child\n");
     pictureView->setContentsPos( 0,0 );
//      pictureView->moveChild(viewLabel,0,0); // recover the position to lefttop
     strcpy(nameString, scan_dir);
     sprintf(nameString, "%s/%s",nameString, fileNameList.at(current_image));

     printf("nameString is .......%s\n", nameString);

     image.load(nameString);
     printf("zoomin smoothscale image\n");
     if( fat_flag )
           GetZoom_standard();
     else      
           GetZoom_orign();
     printf("zoom_w:%d zoom_h:%d\n",zoom_w,zoom_h);
     image = image.smoothScale( zoom_w, zoom_h );
//      printf("zoomin convert image\n");
     pixmap.convertFromImage(image);
//      printf("zoomin set pixmap\n");
     viewLabel->setPixmap(pixmap);
     SetPosition();      
}

void PictureList::zoomOut() // enlarge the image
{
     if( size>=5 )
           return;
     size++;
//      pictureView->moveChild(viewLabel,0,0); // recover the position to lefttop
     pictureView->setContentsPos( 0,0 );
     strcpy(nameString, scan_dir);
     sprintf(nameString, "%s/%s",nameString, fileNameList.at(current_image));
     image.load(nameString);
     if( fat_flag )      // zoom by the 320*240
           GetZoom_standard();
     else      
           GetZoom_orign(); // zoom by the orgin size
     image = image.smoothScale( zoom_w, zoom_h );
     pixmap.convertFromImage(image);
     viewLabel->setPixmap(pixmap);
     SetPosition();      
}

void PictureList::GetZoom_orign()
{
     switch(size)
     {
     case 0:
           zoom_w = orign_w;
           zoom_h = orign_h;
           break;
     case 1:
           zoom_w = orign_w*4/3;
           zoom_h = orign_h*4/3;
           break;
     case 2:
           zoom_w = orign_w*16/9;
           zoom_h = orign_h*16/9;
           break;
     case 3:
           zoom_w = orign_w*64/27;
           zoom_h = orign_h*64/27;
           break;
     case 4:
           zoom_w = orign_w*256/81;
           zoom_h = orign_h*256/81;
           break;
     case 5:
           zoom_w = orign_w*1024/243;
           zoom_h = orign_h*1024/243;
           break;
     case -1:
           zoom_w = orign_w*3/4;
           zoom_h = orign_h*3/4;
           break;
     case -2:
           zoom_w = orign_w*9/16;
           zoom_h = orign_h*9/16;
           break;
     case -3:
           zoom_w = orign_w*27/64;
           zoom_h = orign_h*27/64;
           break;
     case -4:
           zoom_w = orign_w*81/256;
           zoom_h = orign_h*81/256;
           break;
     case -5:
           zoom_w = orign_w*243/1024;
           zoom_h = orign_h*243/1024;
           break;
     default:
           printf("size error\n");            
     }
}

void PictureList::GetZoom_standard()
{
     switch(size)
     {
     case 0:
           zoom_w = stard_w;
           zoom_h = stard_h;
           break;
     case 1:
           zoom_w = stard_w*4/3;
           zoom_h = stard_h*4/3;
           break;
     case 2:
           zoom_w = stard_w*16/9;
           zoom_h = stard_h*16/9;
           break;
     case 3:
           zoom_w = stard_w*64/27;
           zoom_h = stard_h*64/27;
           break;
     case 4:
           zoom_w = stard_w*256/81;
           zoom_h = stard_h*256/81;
           break;
     case 5:
           zoom_w = stard_w*1024/243;
           zoom_h = stard_h*1024/243;
           break;
     case -1:
           zoom_w = stard_w*3/4;
           zoom_h = stard_h*3/4;
           break;
     case -2:
           zoom_w = stard_w*9/16;
           zoom_h = stard_h*9/16;
           break;
     case -3:
           zoom_w = stard_w*27/64;
           zoom_h = stard_h*27/64;
           break;
     case -4:
           zoom_w = stard_w*81/256;
           zoom_h = stard_h*81/256;
           break;
     case -5:
           zoom_w = stard_w*243/1024;
           zoom_h = stard_h*243/1024;
           break;
     default:
           printf("size error\n");            
     }
}

void PictureList::SetPosition()
{
     int w = image.width();
     int h = image.height();
     int offsetx,offsety;
     printf("set Position\n");
     if( w<320||h<240 )      //move to viewport center
     {
           if(w<320)
           {
                 offsetx = (315-w)/2;
                 offsetx=offsetx>0?offsetx:0;
           }
           else
                 offsetx = 0;            
           if(h<240)
           {
                 offsety = (237-h)/2;
                 offsety=offsety>0?offsety:0;
           }
           else
                 offsety = 0;
           printf("set Position execute\n");
           printf(" offsetx:%d offsety:%d\n",offsetx,offsety);
           pictureView->moveChild( viewLabel,offsetx,offsety );                  
           pictureView->setContentsPos( offsetx,offsety );                  
     }
     else
     {
           pictureView->moveChild( viewLabel,0,0 );                  
           pictureView->setContentsPos( 0,0 );
     }
     printf("set Position ok\n");
}

void PictureList::setButtonPixmap( MPushButton1 *b1, unsigned int index ) //set the index pixmap for b1 button
{
     strcpy(nameString,scan_dir);
     sprintf(nameString, "%s/%s",nameString, fileNameList.at(index));

     printf("the %d index image name is.. %s\n", index, nameString );

     struct stat tmpstat;
     lstat(nameString,&tmpstat);
     if(S_ISDIR( tmpstat.st_mode )) // if or not the dictory
     {
           image.load("/usr/pictures/other/dir.png");
           b1->isDir = TRUE;
           printf("is dir:%s\n",nameString);      
     }
     else
     {
           image.load( nameString );
           b1->isDir = FALSE;
           image = image.smoothScale(90,84); //resize the image fit the button
     }
     map.convertFromImage(image);
     b1->setPixmap(map, fileNameList.at(index));
}

int main(int argc, char** argv)
{
  QApplication app(argc,argv);
      app.setFont(QFont("Simsun",16) );
  PictureList pic;
  pic.resize( 320, 240);
  app.setMainWidget(&pic);
  pic.show();
  return app.exec();
}
离线XChinux

只看该作者 3楼 发表于: 2005-10-19
你把.h和.cpp分开写啊,要不然moc怎么处理它
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线rogi1126

只看该作者 4楼 发表于: 2005-10-19
谢谢,第一个问题解决了,不过我MOC是怎么处理的,能不能给我解释一下阿,
离线XChinux

只看该作者 5楼 发表于: 2005-10-19
看Qt Reference吧
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线forgotten
只看该作者 6楼 发表于: 2005-10-19
如果你只用.cpp的化,那么你需要在.cpp的最后

#include "moc_xxx.cpp"

这个moc开头的文件是你用moc来生成的。

Qt的example里面有个这样的例子。否则你无法使用Qt的Metaobject
Life is forgotten
离线rogi1126

只看该作者 7楼 发表于: 2005-10-19
谢谢楼上的老兄~~~
快速回复
限100 字节
 
上一个 下一个