Qt信号与槽的问题

时间:2022-01-15 17:34:16
我在自定义类里有一个signal信号,为DataUpdate(unsigned int a,long b);
想在对话框类中对textEdit写一个槽函数,将a,b的值显示在文本框中。这里涉及到不同类的对象之间进行信号和槽的连接,我不会做,请高手指教。

18 个解决方案

#1


在对话框类中增加一个槽,在创建对话框的类中进行连接。如果可以的话,还可以把DataUpdate信号的参数改成QString的,这样就直接可以连接QTextEdit中的setText槽了。

#2


谢谢回复,我还有一点疑惑,就是connect的对个参数是一个对象名,是不是还要在对话框类中声明一个自定义类的对象呢,如果不声明的话,connect的第一个参数如何写?

#3


自定义的类叫aa
class aa{
...
signals:
        void DataUpdate(QString & sl);
};
对话框类中的构造函数如下
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    aa s;
    connect(&s,SIGNAL(DataUpdate(QString &sl)),ui->textEdit,SLOT(setText(QString & s)));
connect运行不过去?会是什么原因呢?





}

#4


在你的代码中,s是一个局部变量,等Dialog的构造函数结束时,s就没有了呀!

所以,具体该怎样连,还得看你的实际需求。我不是很确定你的aa和Dialog之间是否真的存在聚合或组合关系。

我只能顺这你现在的思路来判断,根据s变量的创建时间,我假定aa和Dialog之间是组合关系。即aa的对象包含在Dialog里面,而且与Dialog对象的生存周期一致。

那么你似乎应该这样写你的代码


Dialog::Dialog(QWidget *parent)
    : QDialog(parent),
      ui(new Ui::Dialog)
{
    ui->setupUi(this);

    // s是Dialog的一个私有成员
    s = new aa;

    connect(s, SIGNAL(DataUpdate(QString &)), ui->textEdit, SLOT(setText(QString &)));
}

#5


对,非常感谢,我改过了对话框中的局部变量,自定义的类叫aa
class aa{
...
signals:
  void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
但提示我如下错误:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\\aa.h:283: 错误:undefined reference to `aa::DataUpdate(QString&)',我不知道如何改,请您赐教。

#6


引用 5 楼 qincaizi 的回复:
对,非常感谢,我改过了对话框中的局部变量,自定义的类叫aa
class aa{
...
signals:
  void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
但提示我如下错误:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-……


这个类aa 要继承自QObject 并声明Q_OBJECT宏

#7


class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\\aa.h:21: 错误:undefined reference to `vtable for aa'
这个vtable如果处理呢?

#8


看红色的部分,笔误?

引用 7 楼 qincaizi 的回复:
class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit  DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4……

#9



看红色的部分,笔误?

引用 7 楼 qincaizi 的回复:

class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit  DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出……
[/Quote]

#10


引用 7 楼 qincaizi 的回复:
class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString &sl);
void run()
{
...

emit DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4_……

void DataUpdate(QString &sl);
程序中DataUpdate函数是正确的,可能是我粘贴时出现了问题,错误仍然存在。

#11


删除你的影子构建目录,重新编译。

#12


确实删除影子构建目录,原来的vtable的错误就没有了,出现了一个新的问题
const QMetaObject aa::staticMetaObject = {
    { &Thread::staticMetaObject, qt_meta_stringdata_aa,
      qt_meta_data_aa, 0 }
};
上面这段代码中,是moc_aa.cpp中的,出现的问题是C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\debug\moc_aa.cpp:44: 错误:'staticMetaObject' is not a member of 'Thread'。这个应该怎么改呢,是我的代码的问题,还是Qt本身运行机理哪个地方我还不明白,麻烦您再赐教,不胜感谢!

#13


还是你的代码有问题呀,楼主得加油了

#14


恩,是要努力了,我这个代码从vc下移到Qt下,问题挺多啊。谢谢您的指导,帮我推荐两本做Qt应用程序的书吧,需要系统的学习学习了,多谢!

#15


就看看《C++ GUI Qt4编程(第二版)》吧,还有一本《C++设计模式——基于Qt4开源跨平台开发框架》

#16


多谢指导,上面的问题我解决了,因为我aa类有一个公有继承类thread,thread也需要继承QObject。
出现了一个新问题,   ui->setupUi(this);
    aa *s = new aa();
    QObject::connect(s,SIGNAL(DataUpdate(QString &sl)),ui->textEdit,SLOT(setText(QString & s)));
问题提示为:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\dialog.cpp:25: 错误: 'QObject' is an ambiguous base of 'aa',关于一个普通的类和一个对话框类之间建立信号与槽关系还有其他需要注意的地方吗?

#17


学习了,有很多高手啊

#18


//只读方式,文本
        QFile file(fname);
        if(!file.open(QIODevice::ReadOnly ))
                return false;
fname是一个char*类型的变量,char str[]="aa.txt",str将值传给fname,运行时文件打开失败,是Qstring *和char *有区别造成的,还是Qt对文件操作有其他的要求?请赐教,不胜感谢。

#1


在对话框类中增加一个槽,在创建对话框的类中进行连接。如果可以的话,还可以把DataUpdate信号的参数改成QString的,这样就直接可以连接QTextEdit中的setText槽了。

#2


谢谢回复,我还有一点疑惑,就是connect的对个参数是一个对象名,是不是还要在对话框类中声明一个自定义类的对象呢,如果不声明的话,connect的第一个参数如何写?

#3


自定义的类叫aa
class aa{
...
signals:
        void DataUpdate(QString & sl);
};
对话框类中的构造函数如下
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    aa s;
    connect(&s,SIGNAL(DataUpdate(QString &sl)),ui->textEdit,SLOT(setText(QString & s)));
connect运行不过去?会是什么原因呢?





}

#4


在你的代码中,s是一个局部变量,等Dialog的构造函数结束时,s就没有了呀!

所以,具体该怎样连,还得看你的实际需求。我不是很确定你的aa和Dialog之间是否真的存在聚合或组合关系。

我只能顺这你现在的思路来判断,根据s变量的创建时间,我假定aa和Dialog之间是组合关系。即aa的对象包含在Dialog里面,而且与Dialog对象的生存周期一致。

那么你似乎应该这样写你的代码


Dialog::Dialog(QWidget *parent)
    : QDialog(parent),
      ui(new Ui::Dialog)
{
    ui->setupUi(this);

    // s是Dialog的一个私有成员
    s = new aa;

    connect(s, SIGNAL(DataUpdate(QString &)), ui->textEdit, SLOT(setText(QString &)));
}

#5


对,非常感谢,我改过了对话框中的局部变量,自定义的类叫aa
class aa{
...
signals:
  void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
但提示我如下错误:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\\aa.h:283: 错误:undefined reference to `aa::DataUpdate(QString&)',我不知道如何改,请您赐教。

#6


引用 5 楼 qincaizi 的回复:
对,非常感谢,我改过了对话框中的局部变量,自定义的类叫aa
class aa{
...
signals:
  void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
但提示我如下错误:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-……


这个类aa 要继承自QObject 并声明Q_OBJECT宏

#7


class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\\aa.h:21: 错误:undefined reference to `vtable for aa'
这个vtable如果处理呢?

#8


看红色的部分,笔误?

引用 7 楼 qincaizi 的回复:
class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit  DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4……

#9



看红色的部分,笔误?

引用 7 楼 qincaizi 的回复:

class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString & sl);
void run()
{
...

emit  DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出……
[/Quote]

#10


引用 7 楼 qincaizi 的回复:
class aa:public QObject{
Q_OBJECT
signals:
void DataUpdate(QString &sl);
void run()
{
...

emit DataUpdate( s);

}
};
谢谢帮忙,我已经照上面改过了,但是出现了一个新的问题,错误提示是C:\t3-build-desktop-Qt_4_7_4_……

void DataUpdate(QString &sl);
程序中DataUpdate函数是正确的,可能是我粘贴时出现了问题,错误仍然存在。

#11


删除你的影子构建目录,重新编译。

#12


确实删除影子构建目录,原来的vtable的错误就没有了,出现了一个新的问题
const QMetaObject aa::staticMetaObject = {
    { &Thread::staticMetaObject, qt_meta_stringdata_aa,
      qt_meta_data_aa, 0 }
};
上面这段代码中,是moc_aa.cpp中的,出现的问题是C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\debug\moc_aa.cpp:44: 错误:'staticMetaObject' is not a member of 'Thread'。这个应该怎么改呢,是我的代码的问题,还是Qt本身运行机理哪个地方我还不明白,麻烦您再赐教,不胜感谢!

#13


还是你的代码有问题呀,楼主得加油了

#14


恩,是要努力了,我这个代码从vc下移到Qt下,问题挺多啊。谢谢您的指导,帮我推荐两本做Qt应用程序的书吧,需要系统的学习学习了,多谢!

#15


就看看《C++ GUI Qt4编程(第二版)》吧,还有一本《C++设计模式——基于Qt4开源跨平台开发框架》

#16


多谢指导,上面的问题我解决了,因为我aa类有一个公有继承类thread,thread也需要继承QObject。
出现了一个新问题,   ui->setupUi(this);
    aa *s = new aa();
    QObject::connect(s,SIGNAL(DataUpdate(QString &sl)),ui->textEdit,SLOT(setText(QString & s)));
问题提示为:C:\t3-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK____\..\t3\dialog.cpp:25: 错误: 'QObject' is an ambiguous base of 'aa',关于一个普通的类和一个对话框类之间建立信号与槽关系还有其他需要注意的地方吗?

#17


学习了,有很多高手啊

#18


//只读方式,文本
        QFile file(fname);
        if(!file.open(QIODevice::ReadOnly ))
                return false;
fname是一个char*类型的变量,char str[]="aa.txt",str将值传给fname,运行时文件打开失败,是Qstring *和char *有区别造成的,还是Qt对文件操作有其他的要求?请赐教,不胜感谢。