• 9764阅读
  • 4回复

【提问】例子程序错在哪? [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2005-11-11
我用了qt的一个程序结果出错了
请指教!
aclock.h:
#ifndef ACLOCK_H
#define ACLOCK_H
                                                   
#include <qwidget.h>
#include <qdatetime.h>
                                                   
class AnalogClock : public QWidget         // analog clock widget
{
  Q_OBJECT
public:
  AnalogClock( QWidget *parent=0, const char *name=0 );
  void setAutoMask(bool b);
                                                   
protected:
  void updateMask();
  void paintEvent( QPaintEvent *);
                                                   
private slots:
  void drawClock( QPainter * );
  void     timeout();
                                                   
private:
  QTime     time;
};

#endif // ACLOCK_H


aclock.cpp:
#include "aclock.h"
#include <qtimer.h>
#include <qpainter.h>
#include <qbitmap.h>
AnalogClock::AnalogClock( QWidget *parent, const char *name )
  : QWidget( parent, name )
{
  time = QTime::currentTime();           // get current time
  QTimer *internalTimer = new QTimer( this ); // create internal timer
  connect( internalTimer, SIGNAL(timeout()), SLOT(timeout()) );
  internalTimer->start( 5000 );           // emit signal every 5 seconds
}
void AnalogClock::timeout()
{
  QTime new_time = QTime::currentTime();     // get the current time
  if ( new_time.minute() != time.minute() ) { // minute has changed
    if (autoMask())
        updateMask();
    else
        update();
  }
}

void AnalogClock::paintEvent( QPaintEvent * )
{
  if ( autoMask() )
    return;
  QPainter paint( this );
  paint.setBrush( colorGroup().foreground() );
  drawClock( &paint );
}
void AnalogClock::updateMask() // paint clock mask
{
  QBitmap bm( size() );
  bm.fill( color0 );             //transparent

  QPainter paint;
  paint.begin( &bm, this );
  paint.setBrush( color1 );      
  paint.setPen( color1 );

  drawClock( &paint );

  paint.end();
  setMask( bm );
}


void AnalogClock::drawClock( QPainter *paint )
{
  paint->save();

  paint->setWindow( -500,-500, 1000,1000 );

  QRect v = paint->viewport();
  int d = QMIN( v.width(), v.height() );
  paint->setViewport( v.left() + (v.width()-d)/2,
                v.top() + (v.height()-d)/2, d, d );

  time = QTime::currentTime();
  QPointArray pts;

  paint->save();
  paint->rotate( 30*(time.hour()%12-3) + time.minute()/2 );
  pts.setPoints( 4, -20,0, 0,-20, 300,0, 0,20 );
  paint->drawPolygon( pts );
  paint->restore();

  paint->save();
  paint->rotate( (time.minute()-15)*6 );
  pts.setPoints( 4, -10,0, 0,-10, 400,0, 0,10 );
  paint->drawPolygon( pts );
  paint->restore();

  for ( int i=0; i<12; i++ ) {
    paint->drawLine( 440,0, 460,0 );
    paint->rotate( 30 );
  }

  paint->restore();
}

void AnalogClock::setAutoMask(bool b)
{
  if (b)
    setBackgroundMode( PaletteForeground );
  else
    setBackgroundMode( PaletteBackground );
  QWidget::setAutoMask(b);
}
main.cpp
#include "aclock.h"
#include <qapplication.h>

int main( int argc, char **argv )
{
  QApplication a( argc, argv );
  AnalogClock *clock = new AnalogClock;
  if ( argc == 2 && strcmp( argv[1], "-transparent" ) == 0 )
    clock->setAutoMask( TRUE );
  clock->resize( 100, 100 );
  a.setMainWidget( clock );
  clock->setCaption("Qt Example - Analog Clock");
  clock->show();
  int result = a.exec();
  delete clock;
  return result;
}
结果错误信息是:
aclock.cpp: In member function `void AnalogClock::drawClock(QPainter*)':
aclock.cpp:71: no matching function for call to `QPainter::setWindow(int, int,
  int, int)'
aclock.cpp:73: no matching function for call to `QPainter::viewport()'
aclock.cpp:76: no matching function for call to `QPainter::setViewport(int,
  int, int&, int&)'
aclock.cpp:82: no matching function for call to `QPainter::rotate(int)'
aclock.cpp:88: no matching function for call to `QPainter::rotate(int)'
aclock.cpp:95: no matching function for call to `QPainter::rotate(int)'
make: *** [aclock.o] Error 1
可是我已经包涵了qpainter.h 文件,里面也有上面的函数
请指教!
离线deweyjew

只看该作者 1楼 发表于: 2005-11-11
你去看看qpainter.h的源文件,可以看到以下内容
#ifndef QT_NO_TRANSFORMATIONS
  void      setViewXForm( bool );            // set xform on/off
  QRect      window()     const;            // get window
  void      setWindow( const QRect & );      // set window
  void      setWindow( int x, int y, int w, int h );
  QRect      viewport()   const;            // get viewport
  void      setViewport( const QRect & );      // set viewport
  void      setViewport( int x, int y, int w, int h );
  …………
  …………
  void      rotate( double a );
#endif

说明你的库在编译的时候,可能没有把这些函数函数编译进来,
(如果你定义了QT_NO_TRANSFORMATIONS的话)

现在你用了这些函数,当然会报错的了
只看该作者 2楼 发表于: 2005-11-14
果然是这样,那我如何改才能通过?
还请deweyjew指教一下!
多谢,多谢!
离线mudfish
只看该作者 3楼 发表于: 2005-11-14
你是用的qt什么版本?编译qt库的时候用的哪个config文件,你就修改那个config文件内容.像我用qt/e2.3.7+
qtopia.1.7.0,编译libqte.so的时候用的是qpe-config.h,默认也是有些#define QT_NO_****,把它注释掉,再重新编译生成libqte.so就OK
只看该作者 4楼 发表于: 2005-11-14
多谢指点!
我试试!
快速回复
限100 字节
 
上一个 下一个