2017-03-31 108 views
0

我对Qt比较陌生,我一直在试图弄清楚如何让不同的按钮在点击时返回一个特定的值。我已阅读通过信号和插槽的Qt文档,但我没有找到有用的东西。如何让多个Qt按钮返回不同的值

我知道我可以使用clicked函数并使用“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 ::连接:没有这样的插槽QEventLoop :: choice0Clicked(&选择)

的QObject ::连接:(发件人名称:“manageEmployee “)

的QObject ::连接:没有这样的槽QEventLoop :: choice1Clicked(&选择)

的QObject ::连接:(发送者名称: '观看')

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

的QObject ::连接:(发件人名称: 'generatePayroll')

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

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

谢谢

+0

你搞砸了,[信号的签名必须与连接插槽的签名匹配](https://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots)。尝试下面的任何一个[Qt的例子](https://doc.qt.io/qt-5/gettingstartedqt.html),并看看按钮被点击时的内容是如何完成的 – Mike

回答

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

现在来到按钮索引

让我们假设你有按钮 - “Button1的”,“按钮2”和“BUTTON3” 。

创建“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); 
} 
+0

没有像'QPushButton :: id ()'。你最后一段想谈什么? – Mike

+0

对不起,但我有一个选择int int choiceChecker函数应该返回一个int。我会在这种情况下返回什么int? –

+0

@ismailyussuf,你为什么需要返回int?只要将它声明为你的'OptionMenuWindow'类的成员(如果你想保存被点击的按钮的状态),并根据被点击的按钮来操作该int。您可以在连接到“clicked”信号的插槽中执行GUI操作(向用户显示反馈)。 。 。 – Mike

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