我是一名学生程序员,正在使用Qt构建GUI应用程序。我试图确保选中某些复选框以继续。这些复选框启用或禁用组框本身,并且是QGroupBox类的一部分。可接受的组合可以是一个或两个。我遇到的问题是从QGroupBox成员函数QGroupBox::setChecked(bool)获取 bool(boolean) 值(至少是我认为的 bool(boolean) 值),并使用它来确定是否显示错误消息。我尝试了几种方法,并引用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中聚集的独特成员打交道时。

在进行更改之前,我使用此方法来构建此过程。并且在设置参数时收到错误消息。编译错误为:没有匹配的函数来调用'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

最佳答案

您正在混合几件事:

  • ui中的QGroupBox实例是指针,因此您必须将它们分配给QGroupBox *(指针),而不是QGroupBox(堆栈上的对象)。
  • ::仅在您调用的方法是静态的(类方法)时才与方法一起使用,在这种情况下不是这样。
  • setChecked()是用于设置组框选中状态的 setter 。它不返回任何内容(无效),因此您不能将它们用作条件。您需要的是getter bool QGroupBox::isChecked()。

  • 您的代码段已清理:
    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();
    }
    

    07-28 04:28