• 5737阅读
  • 8回复

[提问]关于信号和槽的问题 [复制链接]

上一主题 下一主题
离线lazijiding
 

只看楼主 倒序阅读 楼主  发表于: 2011-11-18
本人是新手,刚开始学习信号和槽,遇到些问题,在这里请教一下
  1. class MainWindow : public QMainWindow
  2. {    
  3. Q_OBJECT
  4. signals:                
  5.       void mySignal(int x);
  6. public slots:                
  7.      void mySlot(int x);
  8. public:    
  9.     explicit MainWindow(QWidget *parent = 0);  
  10.     ~MainWindow();
  11. private slots:                
  12.     void on_pushButton_2_clicked();                
  13.     void on_pushButton_clicked();
  14. private:    
  15. Ui::MainWindow *ui;};

  1. MainWindow::MainWindow(QWidget *parent) :
  2. QMainWindow(parent),
  3. ui(new Ui::MainWindow)
  4. {
  5. ui->setupUi(this);
  6. connect(this,SIGNAL(mySignal(int x)),ui->pushButton_2,SLOT(clicked()));
  7. }
  8. MainWindow::~MainWindow()
  9. {
  10. delete ui;
  11. }
  12. void MainWindow::on_pushButton_2_clicked()
  13. {
  14. QMessageBox::about(this,"Tsignal","111");
  15. }
  16. void MainWindow::on_pushButton_clicked()
  17. {
  18. emit mySignal(5);
  19. }


上面是mainwindow.h 和mainwindow.cpp的代码
编译时候会报错:
D:\QTCreator\QT aaa\TsignalApp-build-desktop\debug\moc_mainwindow.cpp:80: 错误:undefined reference to `MainWindow::mySlot(int)'

:-1: 错误:collect2: ld returned 1 exit status

把void mySlot(int x);注释掉 编译通过,但还是会报错
D:\QTCreator\QT aaa\TsignalApp-build-desktop\debug\TsignalApp.exe 启动中...
Object::connect: No such signal MainWindow::mySignal(int x) in [url]..\TsignalApp\mainwindow.cpp:11[/url]
Object::connect: (sender name: 'MainWindow')
Object::connect: (receiver name: 'pushButton_2')

请问哪里出了问题?谢谢!
离线zhy282289
只看该作者 1楼 发表于: 2011-11-18
mySlot(int)槽你只声明了没有实现
connect(this,SIGNAL(mySignal(int x)),ui->pushButton_2,SLOT(clicked()));ui->pushButton它哪有
一个槽叫clicked(),那是信号,记成
connect(this,SIGNAL(mySignal(int x)),ui->pushButton_2,SIGNAL(clicked()));
为什么我脸这么胖~
离线lazijiding

只看该作者 2楼 发表于: 2011-11-18
谢谢2楼回答,不过按照你说的改完以后 还是报同样的错误
D:\QTCreator\QT aaa\TsignalApp-build-desktop\debug\TsignalApp.exe 启动中...
Object::connect: No such signal MainWindow::mySignal(int x) in ..\TsignalApp\mainwindow.cpp:11
Object::connect:  (sender name:   'MainWindow')
Object::connect:  (receiver name: 'pushButton_2')
离线zhy282289
只看该作者 3楼 发表于: 2011-11-18
回 2楼(lazijiding) 的帖子
信号里不要加变量.也是我没看清楚
connect(this,SIGNAL(mySignal(int)),ui->pushButton_2,SIGNAL(clicked()));
为什么我脸这么胖~
离线lazijiding

只看该作者 4楼 发表于: 2011-11-18
谢谢楼上  这次运行成功了!
能不能顺便帮我解决下第一个问题
就是
public slots:                
    void mySlot(int x);
这里貌似有问题,编译出错 ,但是注释掉void mySlot(int x);
以后能编译成功
离线zhy282289
只看该作者 5楼 发表于: 2011-11-18
void mySlot(int x);槽就是一个函数啊,你在头文件声明了,你还要在cpp里定义吧.就是定义他做什么事接到对应的信号后,
为什么我脸这么胖~
离线roywillow

只看该作者 6楼 发表于: 2011-11-18
slot只要在类里面声明了,那么就一定要去实现,但是看上去你的没有具体实现
你的那个connect是将一个信号与另外一个信号关联,没用到那个槽,所以注释掉后就行得通
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线lazijiding

只看该作者 7楼 发表于: 2011-11-18
谢谢大家回答  
离线lazijiding

只看该作者 8楼 发表于: 2011-11-18
谢谢大家 我还有一个问题
我要在一个回调函数里面发信号给mainwindow的槽,回调函数是调用动态库时,动态库的回调函数,不能直接操作mainwindow,这样怎么在回调函数里面定义signals,connect又要怎么连接啊?谢谢了 ,
下面这个是我以前问的问题,现在还没弄好
http://www.qtcn.org/bbs/read-htm-tid-46288.html
快速回复
限100 字节
 
上一个 下一个