LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1180|回复: 5

QT 的一个小问题

[复制链接]
发表于 2005-3-28 09:37:28 | 显示全部楼层 |阅读模式
:help
我想使用信号与槽机制,通一个按钮来设置LCD的值,但是程序并没有响应,代码如下:
--------------------------------------------------------------------------------------------------
#include <qapplication.h>
#include <qpushbutton.h>
#include <qslider.h>
#include <qlcdnumber.h>
#include <qfont.h>

#include <qvbox.h>


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

public slots:
        void setValue()
        {
                slider->setValue(33);
        }
//刚开始时我想用信号来驱动信号,但是发现不成功,后来干脆用槽了
signals:
        void valueChanged()
        {
                        //slider->setValue(33);
        }

protected:
        QSlider *slider;
};


MyWidget::MyWidget( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
//生成一个Quit的按钮,用来退出程序
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) );
        connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );

//这个是我的Set按钮
        QPushButton *set = new QPushButton( "Set", this, "set" );
    set->setFont( QFont( "Times", 18, QFont::Bold ) );

//这个是LCD显示,用this的slider(滑块)成员使它改变
    QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd" );
        lcd->setFixedHeight(30*2);

    slider = new QSlider( Horizontal, this, "slider" );
    slider->setRange( 0, 99 );
    slider->setValue( 0 );

//把slider的信号与LCD的槽位联系起来,通过slider的改变来改变lcd的显示
    connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );

//将set的“点击”信号来驱动该类的setValue槽,
    connect( set, SIGNAL(clicked()), this, SLOT(setValue()) );
}

int main( int argc, char **argv )
{
//以下是QT程序的一般框架,就是显示
    QApplication a( argc, argv );

    MyWidget w;
    a.setMainWidget( &w );
    w.show();
    return a.exec();
}

------------------------------------------------------------------------------------------------------

问题在于,我点击了Set按钮,而数字没有改变?
大家帮忙看看我错在哪里阿?
THANKS!!!

我是用
$qmake -project
来生成Makefile的
$make的时候并没有提示出现什么错误

运行阶段,Konsole提示如下:
QObject::connect: No such slot QVBox::setValue()
QObject::connect:  (sender name:   'set')
QObject::connect:  (receiver name: 'unnamed')

我已经对setValue 定义了阿?
发表于 2005-3-28 12:47:52 | 显示全部楼层
你把*lcd也声明成这个类的成员试试。
回复 支持 反对

使用道具 举报

发表于 2005-3-28 16:32:12 | 显示全部楼层
class MyWidget : public QVBox
{
注意这里要添加 QOBJECT
只要你的类定义了信号or槽,你就得加上这个
public:
MyWidget( QWidget *parent=0, const char *name=0 );

还有,
signals:
void valueChanged()
{
//slider->setValue(33);
}
信号不需要实现,只定义就行了,就是这样
void valueChanged();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-28 23:03:52 | 显示全部楼层
呵呵,感谢楼上的兄弟~~~

后来我查看了一下文档,才发觉自己犯了很多错误
现在我修改了一下,把Q_OBJECT加进我的类中,从而实现自定义的槽和信号

呵呵,原来信号是不需要定义的,而槽的话就需要自己定义功能
后来我修改了一下程序,感觉思路清楚了,但是没有连接成功。大侠帮我看下:)

  1. #include <qapplication.h>
  2. #include <qpushbutton.h>
  3. #include <qslider.h>
  4. #include <qlcdnumber.h>
  5. #include <qfont.h>

  6. #include <qvbox.h>

  7. class MyWidget : public QVBox
  8. {
  9.         Q_OBJECT
  10. public:
  11.     MyWidget( QWidget *parent=0, const char *name=0 );
  12.         int value() const
  13.         {
  14.                 return slider->value();
  15.         }
  16.        
  17. public slots:
  18.         void setValue(int)
  19.         {
  20.                 if (this->value() != 33)
  21.                         emit valueChanged(33);
  22.         }
  23.        
  24. signals:
  25.         void valueChanged(int);

  26. protected:
  27.         QSlider *slider;
  28.                 QLCDNumber  *lcd;
  29. };


  30. MyWidget::MyWidget( QWidget *parent, const char *name )
  31.         : QVBox( parent, name )
  32. {
  33.     QPushButton *quit = new QPushButton( "Quit", this, "quit" );
  34.     quit->setFont( QFont( "Times", 18, QFont::Bold ) );
  35.         connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );

  36.         QPushButton *set = new QPushButton( "Set", this, "set" );
  37.     set->setFont( QFont( "Times", 18, QFont::Bold ) );

  38.     lcd  = new QLCDNumber( 2, this, "lcd" );
  39.         lcd->setFixedHeight(30*2);

  40.     slider = new QSlider( Horizontal, this, "slider" );
  41.     slider->setRange( 0, 99 );
  42.     slider->setValue( 0 );

  43.     connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
  44.        
  45.         connect( set, SIGNAL(clicked()), this, SLOT(setValue(int)));
  46.         connect( this, SIGNAL(valueChanged(int)), slider,SIGNAL(setValue(int)) );

  47. }

  48. int main( int argc, char **argv )
  49. {
  50.     QApplication a( argc, argv );

  51.     MyWidget w;
  52.     a.setMainWidget( &w );
  53.     w.show();
  54.     return a.exec();
  55. }

复制代码


连接错误如下:
quit.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall MyWidget::qt_property(int,int,class QVariant *)" (?qt_property@MyWidget@@UAE_NHHPAVQVariant@@@Z)

quit.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall MyWidget::qt_emit(int,struct QUObject *)" (?qt_emit@MyWidget@@UAE_NHPAUQUObject@@@Z)

还有几个类似的错误
我是在VC下编译的,使用qmake自动生成.dsp文件

谢谢!!!
回复 支持 反对

使用道具 举报

发表于 2005-3-29 09:36:31 | 显示全部楼层
MyWidget::qt_property(int,int,class QVariant *)
这个方法是QT的moc产生的那个你的文件名_moc.cpp的文件的方法,编译没有错误证明你的这个文件产生了,连接找不到说明没有找到你的这*_moc.o文件,我一直在linux下能,windows下面还没有作过。不过windows下面QT应该有一个for msvc的安装的,自动可以用msvc建立基于QT的工程的。
回复 支持 反对

使用道具 举报

发表于 2005-3-29 09:57:16 | 显示全部楼层
建议使用.pro以及qmake来编译
你能省去很多问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表