使用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);
答案 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());
}
然后将所有四个按钮连接到同一个插槽。