我对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;)
我真的相信这样做会更好,如果有的话,有人可以解释一下吗?
如果您需要我详细说明,请在评论中告诉我。
谢谢
答案 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)));