我正在嘗試使用 QtCreator 中的 connect() 方法將整數引數傳遞給函式。
我正在創建一個游戲,用戶可以在其中選擇三個游戲設定選項之一。他們可以單擊按鈕 1、按鈕 2 或按鈕 3,并且應將與他們選擇的設定對應的整數(1、2 或 3)傳遞給函式 setDesiredSetting()。
我知道可以將引數傳遞給插槽 - 我相信我的問題類似于此Qt 5 將引數分配給 QPushButton 的插槽,我嘗試按照解決方案建議使用 QSignalMapper。
問題是,當我去運行我的程式并單擊按鈕 1 進行測驗時,似乎永遠不會呼叫 setDesiredSetting() 函式,因為我沒有看到 qInfo 列印陳述句以所需的設定號列印到終端. 因此,我似乎無法測驗整數引數是否成功傳遞。
代碼:
主視窗.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLineEdit>
#include <QSignalMapper>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
private:
Ui::MainWindow *ui;
private slots:
void setDesiredSetting(int desiredSetting);
};
#endif // MAINWINDOW_H
主視窗.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Desired game theme selected
QSignalMapper mapper;
connect(ui->themeOneButton, SIGNAL(released()), &mapper, SLOT (map()));
mapper.setMapping(ui->themeOneButton, 1);
connect(&mapper, SIGNAL(mapped(int)), this, SLOT (setDesiredSetting(int)));
//connect(ui->themeTwoButton, &QPushButton::clicked, this, &MainWindow::setDesiredSetting(2));
//connect(ui->themeThreeButton, &QPushButton::clicked, this, &MainWindow::setDesiredSetting(3));
}
void MainWindow::setDesiredSetting(int desiredSetting)
{
qInfo("Setting selected: %d \n", desiredSetting);
}
uj5u.com熱心網友回復:
首先,當您似乎已經知道新的信號/插槽語法時,為什么還要使用舊的SIGNAL和宏?SLOT
課堂上沒有這樣mapped()的信號QSignalMapper(很明顯,它不起作用)。也許QSignalMapper::mappedInt()是你想要的?
如果您使用正確的信號/插槽連接語法而不是舊的宏,您會收到一個很好的編譯時錯誤,表明您給出的信號甚至不存在。
如果您不知道,您可以使用 lambda 函式而不是 a QSignalMapper,它會使代碼更加清晰和簡單。
例如:
connect(ui->themeOneButton, &QPushButton::clicked, [&](){
qInfo() << "Selected setting: " << desiredSetting;
});
當然,上面的代碼示例假定該desiredSetting變數在此范圍內是可訪問的,因此 lambda 函式可以獲取對它的參考。(但由于您沒有提及用戶選擇所需設定的方式和位置,因此可能還有更多需要解決的問題)
注意:如果不能保證每次呼叫 lambda 槽時變數都可用,則應通過復制而不是通過參考獲取值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/526190.html
標籤:C qt信号槽
