• 8487阅读
  • 14回复

小白用信号槽时遇到的问题 [复制链接]

上一主题 下一主题
离线mewjerry
 
只看楼主 倒序阅读 楼主  发表于: 2010-02-19
我是小白,大家请不要怒……

新建了一个工程,默认出来的是main.cpp、main.h、mainwindow.cpp、mainwindow.h,

用设计师设计了一个UI然后转化为UI_my.h包含进去了。

自己新增了myConnection.h和myConnection.cpp。

自己在myConnection当中写了一个类,类里面有自己的成员函数,可是在mainwindow当中写了个函数,用于和UI里面的按钮用信号槽连接的时候,发生了错误。

QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
            connection1,SLOT(bConnect()));

报错D:/CPP/BFone/mainwindow.cpp:36: error: no matching function for call to 'MainWindow::connect(QPushButton*&, const char*, myConnection&, const char*)'

怎么解决呢-。-[我纯新手
离线wuleeemail

只看该作者 1楼 发表于: 2010-02-20
Qt既然出了Qt Creator 为何不去用?大家还在这为了一个UI转过来转过去的。你出现的问题应该是没有定义那个槽函数吧.
离线午小夜

只看该作者 2楼 发表于: 2010-02-20
connection1 是什麽? 槽是哪個對象裏的,就改成哪個對象。
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线mewjerry
只看该作者 3楼 发表于: 2010-02-20
引用第1楼wuleeemail于2010-02-20 12:22发表的  :
Qt既然出了Qt Creator 为何不去用?大家还在这为了一个UI转过来转过去的。你出现的问题应该是没有定义那个槽函数吧.

我想说的是我就是用的QTC,UI也是QTD画出来的,只不过我把代码拷贝出来而已。
槽函数也定义了啊- -||

引用第2楼午小夜于2010-02-20 12:29发表的  :
connection1 是什麽? 槽是哪個對象裏的,就改成哪個對象。


反正代码不多,我全放出来算了:

main.cpp:
  1. #include <QtGui/QApplication>
  2. #include "mainwindow.h"
  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication a(argc, argv);
  6.     MainWindow w;
  7.     w.show();
  8.     return a.exec();
  9. }

mainwindow.h:
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QtGui/QMainWindow>
  4. #include "myConnection.h"
  5. namespace Ui {
  6.     class MainWindow;
  7. }
  8. class MainWindow : public QMainWindow {
  9.     Q_OBJECT
  10. public:
  11.     MainWindow(QWidget *parent = 0);
  12.     ~MainWindow();
  13.     myConnection connection1;
  14. protected:
  15.     void changeEvent(QEvent *e);
  16. private:
  17.     Ui::MainWindow *ui;
  18.     void myMakeslot();
  19. };
  20. #endif // MAINWINDOW_H


mainwindow.cpp:

  1. #include "mainwindow.h"
  2. #include "UI_My.h"
  3. #include "myConnection.h"
  4. #include <QtGui/QApplication>
  5. MainWindow::MainWindow(QWidget *parent) :
  6.     QMainWindow(parent),
  7.     ui(new Ui::MainWindow)
  8. {
  9.     ui->setupUi(this);
  10.     connect(*ui->pushButton_2,SIGNAL(clicked()),
  11.             this->connection1,SLOT(bConnect()));
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15.     delete ui;
  16. }
  17. void MainWindow::changeEvent(QEvent *e)
  18. {
  19.     QMainWindow::changeEvent(e);
  20.     switch (e->type()) {
  21.     case QEvent::LanguageChange:
  22.         ui->retranslateUi(this);
  23.         break;
  24.     default:
  25.         break;
  26.     }
  27. }
  28. void MainWindow::myMakeslot()
  29. {
  30.     QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
  31.             this->connection1,SLOT(bConnect())); //这里就是出问题的那行代码。
  32. }


myConnection.h:

  1. #ifndef MYCONNECTION_H
  2. #define MYCONNECTION_H
  3. #include <qdatastream>
  4. #include <qbytearray>
  5. #include <QTcpSocket>
  6. #include <QHostAddress>
  7. class myConnection{
  8. Q_OBJECT
  9. public:
  10.     myConnection();
  11. public slots:
  12.     void bConnect();
  13.     void bWaitConnect();
  14.     void bStopConnect();
  15.     void bStopWait();
  16. private:
  17.     QTcpSocket client;
  18.     QHostAddress hostAddress;
  19.     quint16 hostPort;
  20. };
  21. #endif // MYCONNECTION_H


myConnection.cpp:
  1. #ifndef MYCONNECTION_C
  2. #define MYCONNECTION_C
  3. #include "myConnection.h"
  4. myConnection::myConnection()
  5. {
  6.     hostAddress="0.0.0.0";
  7.     hostPort=8102;
  8. }
  9. void myConnection::bConnect()
  10. {
  11. }
  12. void myConnection::bWaitConnect()
  13. {
  14. }
  15. void myConnection::bStopConnect()
  16. {
  17. }
  18. void myConnection::bStopWait()
  19. {
  20. }
  21. #endif // MYCONNECTION_C
离线xinqingfly

只看该作者 4楼 发表于: 2010-02-21
this->connection1改成&connection1,要用指针
菜鸟也是鸟
离线wuleeemail

只看该作者 5楼 发表于: 2010-02-21
你把那段代码改为:emit  clicked(); 试试。
离线mewjerry
只看该作者 6楼 发表于: 2010-02-21
引用第4楼xinqingfly于2010-02-21 08:14发表的  :
this->connection1改成&connection1,要用指针


改成如下:
  1. QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
  2.             &connection1,SLOT(bConnect()));


错误提示变为

D:/CPP/BFone/mainwindow.cpp:37: error: no matching function for call to 'MainWindow::connect(QPushButton*&, const char*, myConnection*, const char*)'

是不是我理解还是有些偏差……

引用第5楼wuleeemail于2010-02-21 12:31发表的  :
你把那段代码改为:emit  clicked(); 试试。

哪段……不大明白,能详细说说看么
离线mewjerry
只看该作者 7楼 发表于: 2010-02-22
上顶求助
离线wuleeemail

只看该作者 8楼 发表于: 2010-02-22
就是你出错的那一行!
离线wuleeemail

只看该作者 9楼 发表于: 2010-02-22
就是你出错的那一行!
离线mewjerry
只看该作者 10楼 发表于: 2010-02-22
改成
  1. QObject::connect(ui->pushButton_2,SIGNAL(emit clicked()),
  2.             &connection1,SLOT(bConnect()));


error: no matching function for call to 'MainWindow::connect(QPushButton*&, const char*, myConnection*, const char*)'

错误依旧……OTZ……我才写了几行代码,这程序就完全没人知道怎样才能对么……
离线mewjerry
只看该作者 11楼 发表于: 2010-02-23
继续上顶求助……
离线xinqingfly

只看该作者 12楼 发表于: 2010-02-23
myConnection.h头文件中的class myConnection{
改成class myConnection :public QObject{
myMakeslot()函数中改成
QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
            &connection1,SLOT(bConnect()));
菜鸟也是鸟
离线mewjerry
只看该作者 13楼 发表于: 2010-02-23
引用第12楼xinqingfly于2010-02-23 11:29发表的  :
myConnection.h头文件中的class myConnection{
改成class myConnection :public QObject{
myMakeslot()函数中改成
QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
            &connection1,SLOT(bConnect()));

按照这种做法还不能编译通,但是去掉了class myConnection :public QObject{}当中的Q_OBJECT就可以了……

不过为什么一定要从QObject继承才可以呢……

无论如何,感谢您的帮助!
离线xinqingfly

只看该作者 14楼 发表于: 2010-02-23
我的例子编译通过了啊,可以的话程序打包发上来
菜鸟也是鸟
快速回复
限100 字节
 
上一个 下一个