qradiobutton问题

Posted

技术标签:

【中文标题】qradiobutton问题【英文标题】:qradiobutton issue 【发布时间】:2012-08-24 11:48:13 【问题描述】:

单选按钮有问题。

我创建了一个带有两个单选按钮的组框并将其设置为独占,这样当一个被选中时,另一个未被选中。

当我选中一个时,它连接到一个作为函数的插槽,因此它执行操作,更具体地说,更改比例并从 Slider 转换值。

问题是当我错误地点击了已经检查的按钮时,因为即使它已经检查了它仍然连接到函数并且滑块的值再次更改,这是我不想要的。

这是他们的代码:

//Conect change from MM or PIXEL, making the change in the scale
  connect(ui->radioButton, SIGNAL(pressed())), this, SLOT(mm()));
  connect(ui->radioButton_2, SIGNAL(pressed()), this, SLOT(pixel()));

有没有办法在之前已经检查过的情况下阻止它?

我将在这里发布 mm() 和 pixel() 函数:

// Function to transform the slider scale from pixel to mm
void planevolume::mm()

    // Set the sliders ranges and connections
    // X Slider
      double xvaluem=ui->Slider->value();
      ui->Slider->setRange(xmin, xmax/(256.0/3.0), 1.0/(256.0/3.0));
      ui->Slider->setValue(xvaluem/(256.0/3.0));
      ui->Slider->setScale(xmin, (xmax+1.0)/(256.0/3.0), ((xmax+1.0)/16.0)/(256.0/3.0));
      connect(ui->Slider, SIGNAL(valueChanged(double)), ui->lcdNumber, SLOT(display(double)));

    // Y Slider
      double yvaluem=ui->Slider_2->value();
      ui->Slider_2->setRange(ymin, ymax/(512.0), 1.0/(512.0));
      ui->Slider_2->setValue(yvaluem/(512.0));
      ui->Slider_2->setScale(ymin, (ymax+1.0)/512.0, (((ymax+1.0)/16.0)/512.0));
      connect(ui->Slider_2, SIGNAL(valueChanged(double)), ui->lcdNumber_2, SLOT(display(double)));

    // Z Slider
      double zvaluem=ui->Slider_3->value();
      ui->Slider_3->setRange(zmin, zmax/(64.0/3.0), 1.0/(64.0/3.0));
      ui->Slider_3->setValue(zvaluem/(64.0/3.0));
      ui->Slider_3->setScale(zmin, (zmax+1.0)/(64.0/3.0),(((zmax+1.0)/16.0)/(64.0/3.0)));
      connect(ui->Slider_3, SIGNAL(valueChanged(double)), ui->lcdNumber_3, SLOT(display(double)));


// Function to transform the slider scale from mm to pixel
void planevolume::pixel()

    // Set the sliders ranges and connections
    // X Slider
      double xvaluep=ui->Slider->value();
      ui->Slider->setRange(xmin, xmax, 1.0);
      ui->Slider->setValue(xvaluep*(256.0/3.0));
      ui->Slider->setScale(xmin, xmax+1.0, (xmax+1.0)/16.0);
      connect(ui->Slider, SIGNAL(valueChanged(double)), ui->lcdNumber, SLOT(display(double)));

    // Y Slider
      double yvaluep=ui->Slider_2->value();
      ui->Slider_2->setRange(ymin, ymax, 1.0);
      ui->Slider_2->setValue(yvaluep*(512.0));
      ui->Slider_2->setScale(ymin, ymax+1.0, (ymax+1.0)/16.0);
      connect(ui->Slider_2, SIGNAL(valueChanged(double)), ui->lcdNumber_2, SLOT(display(double)));

    // Z Slider
      double zvaluep=ui->Slider_3->value();
      ui->Slider_3->setRange(zmin, zmax, 1.0);
      ui->Slider_3->setValue(zvaluep*(64.0/3.0));
      ui->Slider_3->setScale(zmin, zmax+1.0, (zmax+1.0)/16.0);
      connect(ui->Slider_3, SIGNAL(valueChanged(double)), ui->lcdNumber_3, SLOT(display(double)));

【问题讨论】:

【参考方案1】:

您可以尝试使用toggled(bool) 信号,而不是使用pressed() 信号。仅当按钮更改状态时才会发出此信号。看一看:http://doc.qt.io/qt-4.8/qabstractbutton.html#toggled

编辑:如果两个按钮都连接到toggled(bool),那么选中一个将取消选中另一个并触发信号。但请注意,该信号有一个bool,它给出了按钮的新状态。您的插槽还必须具有此bool 参数,即,在您的情况下,您需要将插槽重写为void planevolume::mm(bool on)void planevolume::pixel(bool on)

完成此操作后,您可以简单地检查参数的值。如果是false,则表示该按钮已被选中,现在刚刚被取消选中。然后,你的两个函数的第一行可以很简单

if (!on) return;

意思是,如果单选按钮刚刚被取消选中,什么也不做,走开。

【讨论】:

但是当我选中一个时,另一个未选中。那也会发送信号对吗? 我已经用 mm() 和 pixel() 函数更新了我的帖子,因此您可以看到使用 toggled() 信号改变了滑块的值。 是的,如果两个按钮都连接到toggled,那么它们会。但请参阅我的答案中的编辑。【参考方案2】:

我认为最好的选择是存储一个与选择哪个选项框相关的 int 值。每次点击选项框时,通过变量检查是否已经被选中,然后再决定。

问候,

【讨论】:

我试图这样做,但它改变了我的价值。例如,如果它是 mm 刻度并且值为 5,如果我单击 mm 它应该什么都不做,但值会改变。 这样? bool check1 = ui->radioButton->isChecked(); bool check2 = ui->radioButton_2->isChecked(); if (check1 == FALSE) connect(ui->radioButton, SIGNAL(clicked()), this, SLOT(mm())); if (check2 == FALSE) connect(ui->radioButton_2, SIGNAL(clicked()), this, SLOT(pixel())); ?还是不行。

以上是关于qradiobutton问题的主要内容,如果未能解决你的问题,请参考以下文章

QT软件开发之基础控件--2.1.3 QRadioButton按钮

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

Qt5-控件-QRadioButton-单选按钮-用于从多个选项中选取一个-单选神器

Qt入门系列开发教程基础控件篇单选按钮QRadioButton

关于mfc中radio button

QRadioButton 样式