如何让多个Qt按钮返回每个不同的值

How to have multiple Qt buttons return each different values

本文关键字:返回 按钮 Qt      更新时间:2023-10-16

我对Qt相对较新,我一直在试图弄清楚如何让不同的按钮在单击时返回一个特定的值。我已经通读了关于信号和插槽的Qt文档,但我没有找到有用的东西。

我知道我可以使用单击的函数并使用"goto 插槽"返回一个值,但是,从主要开始,我只想调用一个 getChoice 函数,该函数将打开一个新窗口,并根据用户单击的内容我将返回一个相应的 int 我可以稍后使用。像这样的东西是它从主要看起来的样子。

OptionMenuWindow option;
int choice = option.checkChoice();

所以这是我在 OptionMenuWindow 类中的代码,我尝试将 int 作为引用传递到插槽,以便在激活 choice0Clicked 时我知道单击了哪个按钮。

int OptionMenuWindow::checkChoice(){
this->show();
QEventLoop waitForResponse;
//THIS IS WHERE I TRY AND DO THAT
connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked()));
connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked()));
connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked()));
waitForResponse.exec();
cout << "here" << endl
cout << choice << endl;
return choice;
}
void OptionMenuWindow::choice0Clicked()
{
choice = 0;
}
void OptionMenuWindow::choice1Clicked()
{
choice = 1;
}
void OptionMenuWindow::choice2Clicked()
{
choice = 2;
}

选择在头文件中定义。

这是我得到的错误:

QObject::connect: no so slot QEventLoop::choice0Clicked(&choice)

QObject::连接:(发件人姓名:"管理员工")

QObject::connect: no like slot QEventLoop::choice1Clicked(&choice)

QObject::连接:(发件人名称:"查看")

QObject::连接:没有这样的插槽 QEventLoop::choice2Clicked(&choice)

QObject::连接:(发件人名称:"生成工资单")

我真的相信这样做更好,所以如果有,有人可以解释一下吗?

如果您有什么需要我详细说明的,请在评论中告诉我。

谢谢

您可以使用QSignalMapper

来自Qt助手:

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

signalMapper = new QSignalMapper(this);
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
}
connect(signalMapper, SIGNAL(mapped(QString)),
this, SIGNAL(clicked(QString)));

您不能使插槽过载。它应该与信号签名匹配。

它应该只是这样的

QObject::connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked()));
QObject::connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked()));
QObject::connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked()));

现在来到按钮索引

假设您有按钮 - "按钮1","按钮2"和"按钮3"。

创建"QButtonGroup"对象。

QButtonGroup *bGroup = new  QButtonGroup ();

添加所有带有 ID 的按钮。

bGroup->addButton(button1, 0);
bGroup->addButton(button2, 1);
bGroup->addButton(button3, 2);

现在在插槽中获取按钮的ID:

void OptionMenuWindow::choice0Clicked()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());          
int buttonID = bGroup->id(button);    
}
void OptionMenuWindow::choice1Clicked()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());    
int buttonID = bGroup->id(button);
}
void OptionMenuWindow::choice2Clicked()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());    
int buttonID = bGroup->id(button);
}