【问题标题】:Using the GroupBoxes in Qt在 Qt 中使用 GroupBox
【发布时间】:2012-01-09 18:18:12
【问题描述】:

我是一名学生程序员,我正在使用 Qt 构建一个 GUI 应用程序。我正在尝试确保选中某些复选框才能继续。这些复选框启用或禁用组框本身,并且是 QGroupBox 类的一部分。接受的组合可以是其中之一或两者。我遇到的问题是从 QGroupBox 成员函数 QGroupBox::setChecked(bool) 获取布尔值(至少我认为它是)并使用它来确定是否显示错误消息。我尝试了几种方法并参考 Qts 文档,希望能找到一个很好的例子。因为我尝试使用的 QGroupBox 是我的 ui 类的成员,所以我尝试创建 QGroupBox 的新实例并将其设置为 ui 的值。然后;使用 if 语句,找出这些框是否被选中。这是我的代码:

QGroupBox activeParticleInjection = ui->groupBoxParticleInjection;
    QGroupBox activeFluidInjection = ui->groupBoxFluidInjection;
    if (activeParticleInjection::setChecked(false) && activeFluidInjection(false));
    {
        QMessageBox noInjectionSelectedError;
        noInjectionSelectedError.setText("Error: No injection type selected");
        noInjectionSelectedError.exec();
    }
    else
    {
        transData.particleInjectionActive = activeParticleInjection::setChecked();
        transData.fluidInjectionActive = activeFluidInjection::setChecked();

这不起作用;从我尝试将 Ui 属性传递给 QGroupBox 的新实例的方式开始。我知道这是一个相对通用的问题,但我尝试直接传递 ui 复选框,这导致了更多问题。我浏览了文档,这让我知道了我试图做到的方式;没有运气。我希望对处理 QGroupBox 的更好方法提供一些反馈。作为一名学生,有时很难找到答案,尤其是在与 QT 中的独特成员打交道时。

在更改之前,我使用这种方法来构建这个过程;我收到了关于我的 if 参数设置方式的错误。编译错误是:没有匹配函数调用 'QGroupBox::isChecked(bool)'

if (ui->groupBoxFluidInjection->isChecked(false) && ui->groupBoxParticleInjection->isChecked(false));
    {
        QMessageBox noInjectionSelectedError;
        noInjectionSelectedError.setText("Error: No injection type selected");
        noInjectionSelectedError.exec();
    }
    else
    {
        transData.particleInjectionActive = ui->groupBoxParticleInjection->isChecked();
        transData.fluidInjectionActive = ui->groupBoxFluidInjection->isChecked();
    }

我一直在使用这些网站来获得最大的帮助: QGroupBox QCheckBox

【问题讨论】:

    标签: c++ qt input qcheckbox qgroupbox


    【解决方案1】:

    你混合了几件事:

    • ui 中的 QGroupBox 实例是指针,因此您必须将它们分配给 QGroupBox*(指针),而不是 QGroupBox(堆栈上的对象)。
    • :: 仅当您调用的方法是静态的(类方法)时才与方法一起使用,此处并非如此。
    • setChecked() 是设置组框选中状态的设置器。它不返回任何内容(void),因此您不能将它们用作条件。你想要的是 getter bool QGroupBox::isChecked()。

    您的代码 sn-p 已清理:

    QGroupBox* activeParticleInjection = ui->groupBoxParticleInjection;
    QGroupBox* activeFluidInjection = ui->groupBoxFluidInjection;
    if (!activeParticleInjection->isChecked() && !activeFluidInjection->isChecked())
    {
        QMessageBox::critical(this, tr("Error"), tr("No injection type selected"));
    }
    else 
    {
        transData.particleInjectionActive = activeParticleInjection->isChecked();
        transData.fluidInjectionActive = activeFluidInjection->isChecked();
    }
    

    【讨论】:

    • 我明白了!完美运行;我还发现您使用 QMessageBox 的方式很有启发性;我不知道你可以这样使用它。它确实需要更少的空间。谢谢您的帮助;你真的帮助我学习和理解这一点。
    【解决方案2】:

    不太确定您尝试在代码中做什么,但这实际上更容易实现。也不要尝试创建副本(您在示例中这样做)。在这种情况下使用引用或指针!

    QGroupBox group("my group box"); // of course this might be a class member, too
    group.setCheckable(true);
    
    // do other things...
    
    if(group.isChecked())
    {
        // do whatever if it's checked
    }
    else
    {
        // do stuff if it isn't checked
    }
    

    检查多个组(或复选框)中的至少一个:

    if(group1.isChecked() || group2.isChecked())
    

    【讨论】:

    • 对不起,有任何误解,我尽量说清楚,我认为你的想法是正确的。我试着做你在这里实际上看起来像这样,我更新了我的帖子来详细说明。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2021-06-22
    相关资源
    最近更新 更多