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

时间:2017-03-31 23:12:30

标签: c++ qt button qt-signals slots

我对Qt相对较新,我一直在试图找出如何使用不同的按钮,每次按钮都会在点击时返回特定值。我已经阅读了Qt doc在信号和插槽上,但我没有找到有用的东西。

我知道我可以使用点击的功能并使用" goto slots"返回一个值。但是,从main开始,我想调用一个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:没有这样的插槽QEventLoop :: choice0Clicked(&amp; choice)

     

QObject :: connect :(发件人姓名:&#39; manageEmployee&#39;)

     

QObject :: connect:没有这样的插槽QEventLoop :: choice1Clicked(&amp; choice)

     

QObject :: connect :(发件人姓名:&#39;查看&#39;)

     

QObject :: connect:没有这样的插槽QEventLoop :: choice2Clicked(&amp; choice)

     

QObject :: connect :(发件人姓名:&#39; generatePayroll&#39;)

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

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

谢谢

2 个答案:

答案 0 :(得分:0)

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

它应该是这样的

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()));

现在进入按钮索引

我们假设您有按钮 - &#34;按钮1&#34;,&#34;按钮2&#34;和&#34;按钮3&#34;。

创建&#34; QButtonGroup&#34;对象

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);
}

答案 1 :(得分:0)

您可以使用 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)));