QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1314|回复: 5

QT 的一个小问题

[复制链接]
发表于 2005-3-28 10:01:04 | 显示全部楼层 |阅读模式
我想使用信号与槽机制,通一个按钮来设置LCD的值,但是程序并没有响应,代码如下:
[code:1]
#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();
}
[/code:1]

问题在于,我点击了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 定义了阿?[/code]
发表于 2005-3-28 10:32:40 | 显示全部楼层
$QTDIR/doc/html/signalsandslots.html

[code:1]
    class Foo : public QObject
    {
        Q_OBJECT
    public:
        Foo();
        int value() const { return val; }
    public slots:
        void setValue( int );
    signals:
        void valueChanged( int );
    private:
        int val;
    };
[/code:1]

多看看文档
回复

使用道具 举报

发表于 2005-3-28 10:33:02 | 显示全部楼层
信号只是一个宏
不能有任何定义
回复

使用道具 举报

 楼主| 发表于 2005-3-28 22:38:54 | 显示全部楼层
嗯,看了一边文档,发觉自己之前就是没有弄清楚就开始胡来了~~~
现在我修改了一下,把Q_OBJECT加进我的类中,从而实现自定义的槽和信号

呵呵,原来信号是不需要定义的,而槽的话就需要自己定义功能
后来我修改了一下程序,感觉思路清楚了,但是没有连接成功。大侠帮我看下:)
[code:1]
#include <qapplication.h>
#include <qpushbutton.h>
#include <qslider.h>
#include <qlcdnumber.h>
#include <qfont.h>

#include <qvbox.h>

class MyWidget : public QVBox
{
        Q_OBJECT
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
        int value() const
        {
                return slider->value();
        }
       
public slots:
        void setValue(int)
        {
                if (this->value() != 33)
                        emit valueChanged(33);
        }
       
signals:
        void valueChanged(int);

protected:
        QSlider *slider;
};


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

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

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

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

    connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
       
        connect( set, SIGNAL(clicked()), this, SLOT(setValue(int)));
        connect( this, SIGNAL(valueChanged(int)), slider,SIGNAL(setValue(int)) );

}

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

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

[/code:1]

连接错误如下:
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 10:18:05 | 显示全部楼层
建议使用.pro文件和qmake来编译
回复

使用道具 举报

 楼主| 发表于 2005-4-7 17:36:44 | 显示全部楼层

终于搞定了,在google找到了答案,贴上来share一下

我发现必须要把类分成.h和.cpp来写才能编译成功的,
不然会跳出一个undefined reference to `vtable for`的错误,
之前把程序想得复杂了,我修改了一下,其实实现起来是很简单的,
也许这个就是QT的机制吧
quit.h
[code:1]
#ifndef __QUIT_H
#define __QUIT_H
#endif

#include <qslider.h>
#include <qlcdnumber.h>
#include <qvbox.h>

class MyWidget : public QVBox
{
        Q_OBJECT
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
        int value() const
        {
                return slider->value();
        }
       
public slots:
        void setValue()
        {
                if (this->value() != 33)
                        //emit valueShow(33);
                        slider->setValue(33);
        }
       
signals:
        void valueShow(int);

protected:
        QSlider *slider;
        QLCDNumber *lcd;
};
[/code:1]

quit.cpp
[code:1]
#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>
#include "quit.h"


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

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

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

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

    connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
       
        connect( set, SIGNAL(clicked()), this, SLOT(setValue()));
//        connect( this, SIGNAL(valueShow(int)), slider,SIGNAL(setValue(int)) );

}

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

    MyWidget w;
    a.setMainWidget( &w );
    w.show();
    return a.exec();
}
[/code:1]

myqt.pro
[code:1]
######################################################################
# Automatically generated by qmake (1.07a) Wed Apr 6 00:22:21 2005
######################################################################

#TEMPLATE = app
#CONFIG -= moc
#INCLUDEPATH += .

# Input
#SOURCES += quit.cpp


TEMPLATE        = app
TARGET                = myqt

CONFIG                += qt warn_on release
DEPENDPATH        = ../../include

REQUIRES        = full-config

HEADERS                = quit.h
SOURCES                = quit.cpp
[/code:1]

在Konsole中执行
#qmake -o Makefile myqt.pro
#make

OK 生成可执行文件,点击Set按钮就可以改变slider滑动条的数字了
我在这里设置是33

Enjoy~~~
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-6 09:37 , Processed in 0.048304 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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