自定义SLOT出错,Object::connect: No such slot MainWindow::pushButton_clicked(text)?

丁老师的技术随笔 2013-03-09 01:29:12
代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QList<QPushButton *> Sensor_list;
Sensor_list.append(ui->pushButton_3);
Sensor_list.append(ui->pushButton_4);
Sensor_list.append(ui->pushButton_5);
Sensor_list.append(ui->pushButton_8);
QString text;
for(int i=0;i<4;i++)
{ text=Sensor_list[i]->text();
connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)));
}

}

MainWindow::~MainWindow()
{
delete ui;
}




void MainWindow::pushButton_clicked(QString text)
{
qDebug()<<text;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:

void pushButton_clicked(QString text);



private:
Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H



运行是出现:
Object::connect: No such slot MainWindow::pushButton_clicked(text)
Object::connect: (sender name: 'pushButton_3')
Object::connect: (receiver name: 'MainWindow')
Object::connect: No such slot MainWindow::pushButton_clicked(text)
Object::connect: (sender name: 'pushButton_4')
Object::connect: (receiver name: 'MainWindow')
Object::connect: No such slot MainWindow::pushButton_clicked(text)
Object::connect: (sender name: 'pushButton_5')
Object::connect: (receiver name: 'MainWindow')
Object::connect: No such slot MainWindow::pushButton_clicked(text)
Object::connect: (sender name: 'pushButton_8')
Object::connect: (receiver name: 'MainWindow')
这是为何???我明明有MainWindow::pushButton_clicked(text)?
...全文
1507 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_27841603 2015-06-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/mcgrady_tracy/article/details/6996947 对于多个按钮对应不同的值推荐使用QSignalMapper使用方法可以参考楼上的帖子
cetium 2014-08-13
  • 打赏
  • 举报
回复
moc对格式要求比较严格 头文件中 private slots: xxx yyy 中间不能加任何东西 实现中:connect(xxx)中注意空格问题
Frontier0457 2014-07-04
  • 打赏
  • 举报
回复
简单的看有没有对象类继承QObject没
jdwx 2013-03-19
  • 打赏
  • 举报
回复
拜托看看书,connect不是很难理解吧。
  • 打赏
  • 举报
回复
引用 3 楼 openXMPP 的回复:
引用 2 楼 qustdjx 的回复: 引用 1 楼 zhango5 的回复:connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushB……
拜托你好好看看我的帖子,我首先纠正他参数问题,然后说了信号和槽参数不匹配,无法正确connect,你在这质问我有何用啊?
  • 打赏
  • 举报
回复
引用 7 楼 openXMPP 的回复:
我前面已经说了 你要么在pushButton_click里自己去处理 要么另外封装一个slot,当触发clicked()事件时,在这个自己定义的slot里去封装你需要的参数,然后再次发送signal 类似如下 void MainWindow::signal_btn_clicked() { int index = ...; QStrin……
这样意味着又要为每一个按钮写一个emit 。。。,因为我的QString 是来至Sensor_list[i].text();所以必须得知道哪个按钮被按下了,(我的按钮很多。。。。),你觉着呢?
乔巴好萌 2013-03-10
  • 打赏
  • 举报
回复
我前面已经说了 你要么在pushButton_click里自己去处理 要么另外封装一个slot,当触发clicked()事件时,在这个自己定义的slot里去封装你需要的参数,然后再次发送signal 类似如下 void MainWindow::signal_btn_clicked() { int index = ...; QString txt = ...; emit myDefineSignal(index,txt); }
  • 打赏
  • 举报
回复
引用 4 楼 openXMPP 的回复:
引用 2 楼 qustdjx 的回复:引用 1 楼 zhango5 的回复:connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this……
这个道理我懂啦,但貌似往里面传参行不通啊?
  • 打赏
  • 举报
回复
引用 3 楼 openXMPP 的回复:
引用 2 楼 qustdjx 的回复:引用 1 楼 zhango5 的回复:connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this……
但这样不能确定Sensor_list[i]中的哪个按键被按下了啊?真不想每一个按钮都 写一个槽函数
乔巴好萌 2013-03-10
  • 打赏
  • 举报
回复
引用 2 楼 qustdjx 的回复:
引用 1 楼 zhango5 的回复:connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_cl……
slot时声明为 void pushButton_clicked(QString text); 则进行connect绑定时语法为 QObject::connect(xx,SIGNAL(),XXX,SLOT(pushButton_clicked(QString))); 注意后面跟的是类型,而不是变量名,编译器只关心变量的类型,不关心变量名 但你signal和slot类型不匹配,里面的参数一个是QString类型,一个是无参数的,你如何期望对于你这种自定义的行为,编译器或qt框架能给你传递正确的值呢?
乔巴好萌 2013-03-10
  • 打赏
  • 举报
回复
引用 2 楼 qustdjx 的回复:
引用 1 楼 zhango5 的回复:connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_cl……
connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text))); signal的接口为“clicked()" 是个无参数的signal 而SLOT为puhsButton_clicked(QString)是一个有参数的,参数为QString connect接口只传递参数类型,不传递参数名 所以正确的方式应该为 connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked())); 你可以在pushButton_clicked里再去根据Sensor_list[i]对象获取当前值
  • 打赏
  • 举报
回复
引用 1 楼 zhango5 的回复:
connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(QString))); ……
那怎么能将参数 text传进槽函数里面呢?signal和slot参数怎么不匹配呢?
  • 打赏
  • 举报
回复
connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(text)))这句怎么能带参数呢,后面的SLOT应该是参数的类型啊,connect(Sensor_list[i],SIGNAL(clicked()),this,SLOT(pushButton_clicked(QString))); 并且signal和slot参数不匹配啊,这也是个问题啊

16,414

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧