传递变量或QString以在SLOT(function())C ++中起作用

时间:2015-05-06 15:06:35

标签: c++ qt

使用Qt和C ++的快速问题。

这就是我现在所拥有的,但我需要创建四个函数,我觉得这非常混乱,我宁愿有一个函数,我可以传递一个变量或文本并清理它。 / p>

MainMenu.cpp:

#include "mainmenu.h"
#include "ui_mainmenu.h"

MainMenu::MainMenu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainMenu)
{
    ui->setupUi(this);

    connect(ui->nesButton, SIGNAL(clicked()), this, SLOT(nesButtonPressed()));
    connect(ui->snesButton, SIGNAL(clicked()), this, SLOT(snesButtonPressed()));
    connect(ui->genesisButton, SIGNAL(clicked()), this, SLOT(genesisButtonPressed()));
    connect(ui->ps2Button, SIGNAL(clicked()), this, SLOT(ps2ButtonPressed()));
}

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

void MainMenu::nesButtonPressed()
{
    ui->gameLabel->setText("NES");
}

void MainMenu::snesButtonPressed()
{
    ui->gameLabel->setText("SNES");
}

void MainMenu::genesisButtonPressed()
{
    ui->gameLabel->setText("Genesis");
}

void MainMenu::ps2ButtonPressed()
{
    ui->gameLabel->setText("PS2");
}

MainMenu.h:

private slots:
    void nesButtonPressed();
    void snesButtonPressed();
    void genesisButtonPressed();
    void ps2ButtonPressed();

但这有四个功能。我想做的是以下内容,但我似乎无法让它发挥作用。

MainMenu.cpp

connect(ui->nesButton, SIGNAL(clicked()), this, SLOT(onButtonPressed("NES")));
connect(ui->snesButton, SIGNAL(clicked()), this, SLOT(onButtonPressed("SNES")));
connect(ui->genesisButton, SIGNAL(clicked()), this, SLOT(onButtonPressed("Genesis")));
connect(ui->ps2Button, SIGNAL(clicked()), this, SLOT(onButtonPressed("PS2")));

只需一个功能:

void MainMenu::onButtonPressed(QString game)
{
    ui->gameLabel->setText(game);
}

根据按下的按钮,可以设置标签的文本。它似乎没有用。我已在头文件中正确设置了该函数,但我不断收到错误QObject::connect: No such slot MainMenu::nesButtonPressed("NES")

我已尝试设置变量名称,并在头文件中定义它们,但似乎没有任何效果。希望有人可以提供帮助。

提前谢谢!

编辑,下面的工作代码:

MainMenu.cpp:

#include "mainmenu.h"
#include "ui_mainmenu.h"

MainMenu::MainMenu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainMenu)
{
    ui->setupUi(this);

    signalMapper = new QSignalMapper(this);
    signalMapper->setMapping(ui->nesButton, QString("NES"));
    signalMapper->setMapping(ui->snesButton, QString("SNES"));
    signalMapper->setMapping(ui->ps2Button, QString("PS2"));
    signalMapper->setMapping(ui->genesisButton, QString("Genesis"));

    connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(onButtonPressed(QString)));
    connect(ui->nesButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
    connect(ui->snesButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
    connect(ui->ps2Button, SIGNAL(clicked()), signalMapper, SLOT(map()));
    connect(ui->genesisButton, SIGNAL(clicked()), signalMapper, SLOT(map()));

}

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

void MainMenu::onButtonPressed(QString game)
{
    ui->gameLabel->setText(game);
}

MainMenu.h:

signals:
    void clicked(const QString &text);

private:
    Ui::MainMenu *ui;
    QSignalMapper *signalMapper;

private slots:
    void onButtonPressed(QString game);

4 个答案:

答案 0 :(得分:4)

尝试使用QSignalMapper,似乎是您特定问题的一个选项 http://doc.qt.io/qt-5/qsignalmapper.html

来自docs:

  

该类收集一组无参数信号,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。

答案 1 :(得分:2)

您可以使用QObject::sender()方法找出点击来自哪个按钮

虚拟对话框类,带有4个按钮和一个文本标签:

<强> dialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>
#include "ui_dialog.h"

class MyDialog : public QDialog, public Ui::Dialog
{
  Q_OBJECT
  public:
  MyDialog(QWidget *parent = 0) : QDialog() {
    setupUi(this);
    connect( pushButton_1, SIGNAL( clicked() ) , this, SLOT( buttonPressed() ) );
    connect( pushButton_2, SIGNAL( clicked() ) , this, SLOT( buttonPressed() ) );
    connect( pushButton_3, SIGNAL( clicked() ) , this, SLOT( buttonPressed() ) );
    connect( pushButton_4, SIGNAL( clicked() ) , this, SLOT( buttonPressed() ) );
  }

  public slots:
  void buttonPressed();

};

#endif

然后是buttonPressed()方法

<强> dialog.cpp

#include "dialog.h"


void MyDialog::buttonPressed()
{
  QPushButton *button = static_cast<QPushButton*>( sender() );
  if( button == pushButton_1 ) {
    label->setText("1");
  } else if( button == pushButton_2 ) {
    label->setText("2");
  } else if( button == pushButton_3 ) {
    label->setText("3");
  } else if( button == pushButton_4 ) {
    label->setText("4");
  }

}

以及完整性的主要内容

<强>的main.cpp

#include <QApplication>

#include "dialog.h"

int main(int argc,char** argv)
{
  QApplication app(argc,argv);
  MyDialog dialog;

  dialog.show();

  return app.exec();

}

答案 2 :(得分:1)

如果你使用Qt 5和C ++ 11或更高版本,你可以使用lambdas:

connect(ui->nesButton, &QPushButton::clicked,
        this, [this](){onButtonPressed("NES");});

connect(ui->snesButton, &QPushButton::clicked,
        this, [this](){onButtonPressed("SNES");});

connect(ui->genesisButton, &QPushButton::clicked,
        this, [this](){onButtonPressed("NES");});

connect(ui->ps2Button, &QPushButton::clicked,
        this, [this](){onButtonPressed("PS2");});

答案 3 :(得分:0)

我认为你可以让它更简单:

void MainMenu::buttonPlatformSelectorPressed()
{
    // This assumes the button text can be used for the label as well.
    QPushButton *button = static_cast<QPushButton*>( sender() );
    label->setText(button.Text());
} 

然后将所有四个按钮连接到同一个插槽。