方式一:
// 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 );
第一種方式拖動沒有反應
uj5u.com熱心網友回復:
信號和槽引數不匹配uj5u.com熱心網友回復:
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?
uj5u.com熱心網友回復:
應該不是,信號的引數可以比槽的多。
uj5u.com熱心網友回復:
樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽uj5u.com熱心網友回復:
信號和槽引數不匹配
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?
應該不是,信號的引數可以比槽的多。
uj5u.com熱心網友回復:
樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽
uj5u.com熱心網友回復:
我確認宣告的是slot,而且測驗過不行,才在網上搜的第二種方法。 樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽
我測驗過是可以的,我把ui上的變數名字改的跟你一模一樣,slot名字也一模一樣,直接復制你代碼的,確實是有效的
你在定義MainWindow的時候有沒有加Q_OBJECT?
要是沒有加的話宣告了slot也無效的
uj5u.com熱心網友回復:
我確認宣告的是slot,而且測驗過不行,才在網上搜的第二種方法。 樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽
我測驗過是可以的,我把ui上的變數名字改的跟你一模一樣,slot名字也一模一樣,直接復制你代碼的,確實是有效的
你在定義MainWindow的時候有沒有加Q_OBJECT?
要是沒有加的話宣告了slot也無效的
uj5u.com熱心網友回復:
mainwindow是自動生成的,我沒做任何處理,slot加過的 我確認宣告的是slot,而且測驗過不行,才在網上搜的第二種方法。 樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽
我測驗過是可以的,我把ui上的變數名字改的跟你一模一樣,slot名字也一模一樣,直接復制你代碼的,確實是有效的
你在定義MainWindow的時候有沒有加Q_OBJECT?
要是沒有加的話宣告了slot也無效的
光說講不清楚呀,要不把你的mainwindow.h貼出來看看?
uj5u.com熱心網友回復:
mainwindow是自動生成的,我沒做任何處理,slot加過的 我確認宣告的是slot,而且測驗過不行,才在網上搜的第二種方法。 樓上說的沒錯,而且我實驗過了,第一種方法是有效的,除非你沒有把sliderRef_Click和sliderFluo_Click宣告為slot,新的連接方式可以直接連接普通成員方法,第一種必須連槽
我測驗過是可以的,我把ui上的變數名字改的跟你一模一樣,slot名字也一模一樣,直接復制你代碼的,確實是有效的
你在定義MainWindow的時候有沒有加Q_OBJECT?
要是沒有加的話宣告了slot也無效的
光說講不清楚呀,要不把你的mainwindow.h貼出來看看?
#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 啊
uj5u.com熱心網友回復:
有 Q_OBJECT 啊
怎么不貼完整一點,本想順便看看slot那里呢
還有你用第一種方法連接的時候,回傳值是什么,如果connect失敗,應用程式輸出那邊也是會輸出失敗原因的
uj5u.com熱心網友回復:
有 Q_OBJECT 啊
怎么不貼完整一點,本想順便看看slot那里呢
還有你用第一種方法連接的時候,回傳值是什么,如果connect失敗,應用程式輸出那邊也是會輸出失敗原因的
private slots:
void OnReadSerialData();
void OnOpenPort();
void OnClosePort();
void sliderRef_Click(int v);
void sliderFluo_Click(int v);
private:
Ui::MainWindow *ui;
uj5u.com熱心網友回復:
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();
uj5u.com熱心網友回復:
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();
connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) ));
但是這樣也不行啊
uj5u.com熱心網友回復:
connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) ));
但是這樣也不行啊
為什么你總是要改引數?汗一個,本來的signal函式也是有int引數的啊
connect(ui->horizontalSliderRef, SIGNAL(valueChanged(int)), this, SLOT(sliderRef_Click(int)));
uj5u.com熱心網友回復:
其實我覺得你也沒必要搞第一種方法,第二種連接寫法特別適合你這種搞不清楚怎么寫引數的人,而且現在本來就官方推薦使用第二種方法了uj5u.com熱心網友回復:
其實我覺得你也沒必要搞第一種方法,第二種連接寫法特別適合你這種搞不清楚怎么寫引數的人,而且現在本來就官方推薦使用第二種方法了
uj5u.com熱心網友回復:
信號也有引數?不是一般槽函式才有引數吧。第一種怎樣改才行? 信號和槽引數不匹配
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged(int)), this, SLOT(sliderFluo_Click() ));
去掉IGNAL(valueChanged(int)里面的int?
connect(ui->horizontalSliderFluo, SIGNAL(valueChanged()), this, SLOT(sliderFluo_Click() )) ?
應該不是,信號的引數可以比槽的多。
可以有引數的,但是引數要比槽函式的多或等于。
uj5u.com熱心網友回復:
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();
connect(ui->horizontalSliderRef, SIGNAL(valueChanged()), this, SLOT(sliderRef_Click(int) ));
但是這樣也不行啊
valueChanged的int引數呢??你是不是漏了
uj5u.com熱心網友回復:
一樓已經回答你的問題了。官方的技術檔案非常明確說明了兩種連接方式的區別,
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.
uj5u.com熱心網友回復:
所以說,芒果黑早就正確回答了你的問題了轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/18808.html
標籤:Qt
上一篇:關于抖音私密權限設定的問題
