qt QSlider 信号和曹的连接方法为什么第一种方式不行

number007cool 2020-07-17 02:45:24
方式一:

// connect(ui->horizontalSliderRef, SIGNAL(valueChanged(int)), this, SLOT(sliderRef_Click() ));
//connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));


方式2:

connect(ui->horizontalSliderRef, &QSlider::valueChanged, this, &MainWindow::sliderRef_Click );
connect(ui->horizontalSliderFluo, &QSlider::valueChanged, this, &MainWindow::sliderFluo_Click );


第一种方式拖动没有反应
...全文
5933 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2020-07-21
  • 打赏
  • 举报
回复
所以说,芒果黑早就正确回答了你的问题了
donwmufromdying 2020-07-21
  • 打赏
  • 举报
回复
一楼已经回答你的问题了。 官方的技术文档非常明确说明了两种连接方式的区别, The other way to connect a signal to a slot is to use QObject::connect() and the SIGNAL and SLOT macros. The rule about whether to include arguments or not in the SIGNAL() and SLOT() macros, if the arguments have default values, is that the signature passed to the SIGNAL() macro must not have fewer arguments than the signature passed to the SLOT() macro. All of these would work: connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(Qbject*))); connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed())); connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed())); But this one won't work: connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed(QObject*))); ...because the slot will be expecting a QObject that the signal will not send. This connection will report a runtime error.
  • 打赏
  • 举报
回复
引用 14 楼 number007cool 的回复:
[quote=引用 13 楼 mideum 的回复:][quote=引用 12 楼 number007cool 的回复:]
void sliderRef_Click(int v);
void sliderFluo_Click(int v);

那这就是问题了,既然你有int作为参数,SLOT(sliderRef_Click() )肯定找不到,参数对不上啊,SLOT(sliderRef_Click(int))才行
如果你要写SLOT(sliderRef_Click()),那么slot方法就应该是没有参数的
void sliderRef_Click();
void sliderFluo_Click();
[/quote]

connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) ));

但是这样也不行啊[/quote]

valueChanged的int参数呢??你是不是漏了
  • 打赏
  • 举报
回复
引用 5 楼 number007cool 的回复:
[quote=引用 3 楼 太空堡垒185 的回复:][quote=引用 2 楼 number007cool 的回复:][quote=引用 1 楼 芒果黑 的回复:]信号和槽参数不匹配

connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?[/quote]
应该不是,信号的参数可以比槽的多。[/quote]信号也有参数?不是一般槽函数才有参数吧。第一种怎样改才行?[/quote]
可以有参数的,但是参数要比槽函数的多或等于。
number007cool 2020-07-20
  • 打赏
  • 举报
回复
引用 16 楼 mideum 的回复:
其实我觉得你也没必要搞第一种方法,第二种连接写法特别适合你这种搞不清楚怎么写参数的人,而且现在本来就官方推荐使用第二种方法了
好吧,方式2
mideum 2020-07-20
  • 打赏
  • 举报
回复
其实我觉得你也没必要搞第一种方法,第二种连接写法特别适合你这种搞不清楚怎么写参数的人,而且现在本来就官方推荐使用第二种方法了
mideum 2020-07-20
  • 打赏
  • 举报
回复
引用 14 楼 number007cool 的回复:
connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) ));

但是这样也不行啊

为什么你总是要改参数?汗一个,本来的signal函数也是有int参数的啊
connect(ui->horizontalSliderRef, SIGNAL(valueChanged(int)), this, SLOT(sliderRef_Click(int)));
number007cool 2020-07-20
  • 打赏
  • 举报
回复
引用 13 楼 mideum 的回复:
[quote=引用 12 楼 number007cool 的回复:] void sliderRef_Click(int v); void sliderFluo_Click(int v);
那这就是问题了,既然你有int作为参数,SLOT(sliderRef_Click() )肯定找不到,参数对不上啊,SLOT(sliderRef_Click(int))才行 如果你要写SLOT(sliderRef_Click()),那么slot方法就应该是没有参数的
void sliderRef_Click();
void sliderFluo_Click();
[/quote] connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) )); 但是这样也不行啊
mideum 2020-07-20
  • 打赏
  • 举报
回复
引用 12 楼 number007cool 的回复:
void sliderRef_Click(int v);
void sliderFluo_Click(int v);

那这就是问题了,既然你有int作为参数,SLOT(sliderRef_Click() )肯定找不到,参数对不上啊,SLOT(sliderRef_Click(int))才行
如果你要写SLOT(sliderRef_Click()),那么slot方法就应该是没有参数的
void sliderRef_Click();
void sliderFluo_Click();
number007cool 2020-07-20
  • 打赏
  • 举报
回复
引用 11 楼 mideum 的回复:
[quote=引用 10 楼 number007cool 的回复:] 有 Q_OBJECT 啊
怎么不贴完整一点,本想顺便看看slot那里呢 还有你用第一种方法连接的时候,返回值是什么,如果connect失败,应用程序输出那边也是会输出失败原因的[/quote] private slots: void OnReadSerialData(); void OnOpenPort(); void OnClosePort(); void sliderRef_Click(int v); void sliderFluo_Click(int v); private: Ui::MainWindow *ui;
mideum 2020-07-20
  • 打赏
  • 举报
回复
引用 10 楼 number007cool 的回复:
有 Q_OBJECT 啊

怎么不贴完整一点,本想顺便看看slot那里呢
还有你用第一种方法连接的时候,返回值是什么,如果connect失败,应用程序输出那边也是会输出失败原因的
number007cool 2020-07-20
  • 打赏
  • 举报
回复
引用 9 楼 mideum 的回复:
引用 8 楼 number007cool 的回复:
[quote=引用 7 楼 mideum 的回复:][quote=引用 6 楼 number007cool 的回复:][quote=引用 4 楼 mideum 的回复:]楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
我确认声明的是slot,而且测试过不行,才在网上搜的第二种方法。
我测试过是可以的,我把ui上的变量名字改的跟你一模一样,slot名字也一模一样,直接复制你代码的,确实是有效的 你在定义MainWindow的时候有没有加Q_OBJECT? 要是没有加的话声明了slot也无效的[/quote]mainwindow是自动生成的,我没做任何处理,slot加过的[/quote] 光说讲不清楚呀,要不把你的mainwindow.h贴出来看看?[/quote]
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>

#include "Pub_Frame.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


class MainWindow : public QMainWindow,Pub_Frame
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    QString m_strLogFile;

    //初始化
    void Init();
    void InitChart();
    void InitSerialPort();
    void InitLogFile();
    void Init_Lcd();

    void Init_Slider();
有 Q_OBJECT 啊
mideum 2020-07-18
  • 打赏
  • 举报
回复
引用 6 楼 number007cool 的回复:
引用 4 楼 mideum 的回复:
楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
我确认声明的是slot,而且测试过不行,才在网上搜的第二种方法。

我测试过是可以的,我把ui上的变量名字改的跟你一模一样,slot名字也一模一样,直接复制你代码的,确实是有效的
你在定义MainWindow的时候有没有加Q_OBJECT?
要是没有加的话声明了slot也无效的
number007cool 2020-07-18
  • 打赏
  • 举报
回复
引用 7 楼 mideum 的回复:
引用 6 楼 number007cool 的回复:
[quote=引用 4 楼 mideum 的回复:]楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
我确认声明的是slot,而且测试过不行,才在网上搜的第二种方法。

我测试过是可以的,我把ui上的变量名字改的跟你一模一样,slot名字也一模一样,直接复制你代码的,确实是有效的
你在定义MainWindow的时候有没有加Q_OBJECT?
要是没有加的话声明了slot也无效的[/quote]mainwindow是自动生成的,我没做任何处理,slot加过的
mideum 2020-07-18
  • 打赏
  • 举报
回复
引用 8 楼 number007cool 的回复:
引用 7 楼 mideum 的回复:
[quote=引用 6 楼 number007cool 的回复:][quote=引用 4 楼 mideum 的回复:]楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
我确认声明的是slot,而且测试过不行,才在网上搜的第二种方法。

我测试过是可以的,我把ui上的变量名字改的跟你一模一样,slot名字也一模一样,直接复制你代码的,确实是有效的
你在定义MainWindow的时候有没有加Q_OBJECT?
要是没有加的话声明了slot也无效的[/quote]mainwindow是自动生成的,我没做任何处理,slot加过的[/quote]
光说讲不清楚呀,要不把你的mainwindow.h贴出来看看?
number007cool 2020-07-17
  • 打赏
  • 举报
回复
引用 4 楼 mideum 的回复:
楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
我确认声明的是slot,而且测试过不行,才在网上搜的第二种方法。
number007cool 2020-07-17
  • 打赏
  • 举报
回复
引用 3 楼 太空堡垒185 的回复:
[quote=引用 2 楼 number007cool 的回复:][quote=引用 1 楼 芒果黑 的回复:]信号和槽参数不匹配

connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?[/quote]
应该不是,信号的参数可以比槽的多。[/quote]信号也有参数?不是一般槽函数才有参数吧。第一种怎样改才行?
mideum 2020-07-17
  • 打赏
  • 举报
回复
楼上说的没错,而且我实验过了,第一种方法是有效的,除非你没有把sliderRef_Click和sliderFluo_Click声明为slot,新的连接方式可以直接连接普通成员方法,第一种必须连槽
  • 打赏
  • 举报
回复
引用 2 楼 number007cool 的回复:
[quote=引用 1 楼 芒果黑 的回复:]信号和槽参数不匹配

connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?[/quote]
应该不是,信号的参数可以比槽的多。
number007cool 2020-07-17
  • 打赏
  • 举报
回复
引用 1 楼 芒果黑 的回复:
信号和槽参数不匹配
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() )); 去掉IGNAL(valueChanged(int)里面的int? connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?
加载更多回复(1)

16,816

社区成员

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

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