【问题标题】:How to have multiple Qt buttons return each different values如何让多个 Qt 按钮返回每个不同的值
【发布时间】:2017-08-26 07:52:37
【问题描述】:

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

我知道我可以只使用 clicked 函数并使用“goto slot”返回一个值,但是,我想从主函数中调用一个 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(&choice)

QObject::connect:(发件人姓名:'manageEmployee')

QObject::connect: No such slot QEventLoop::choice1Clicked(&choice)

QObject::connect:(发送者名称:'view')

QObject::connect: No such slot QEventLoop::choice2Clicked(&choice)

QObject::connect:(发件人姓名:'generatePayroll')

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

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

谢谢

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    应该只是这样

    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”、“button2”和“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);
    }
    

    【讨论】:

    • 没有QPushButton::id()这样的功能。你想在最后一段中谈论什么?
    • 我很抱歉,但我有一个选择 int 应该返回一个 int 的choiceChecker 函数。在这种情况下,我将返回什么整数?
    • @ismailyussuf,为什么需要返回 int?只需将其声明为 OptionMenuWindow 类的成员(如果您想保存被单击按钮的状态),并根据被单击的按钮操作该 int 。您可以在连接到clicked 信号的插槽中执行 GUI 操作(以向用户显示反馈)。 . .
    • 对不起是组->。我正在用手机打字。我会改的。
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多