取消选中/选中 QCheckBox 后使 QLabel 不可见/可见

Posted

技术标签:

【中文标题】取消选中/选中 QCheckBox 后使 QLabel 不可见/可见【英文标题】:Making a QLabel invisible/visible after unchecking/checking QCheckBox 【发布时间】:2015-01-29 05:22:26 【问题描述】:

我将从描述我的 C++ GUI 应用开始。

我有一个主屏幕(主窗口),其中有许多显示各种数据的标签(kpi)。主屏幕中有一个设置按钮,按下它会打开一个设置对话框(consettingsdialog),其中包含主窗口标签和应用程序本身的各种参数设置。在consettings对话框中按下保存按钮后设置参数被保存。

如果在 consettingsdialog 中选中或取消选中相应的复选框,我的目标是使主窗口中的某些标签可见/不可见。

这是我到目前为止所做的细节;

在我的 consettingsdialog.cpp 中

ConSettingsDialog::ConSettingsDialog(QWidget *parent)
      : QDialog(parent)

    setupUi(this);
    kpi1CheckBox->setChecked(true);


void ConSettingsDialog :: onSaveButton()

if(kpi1CheckBox->isChecked()==true)
    
        kpi1CheckBox->setChecked(true);
        emit setHomeScreenKpiVisibility();     
    
    else
    
        kpi1CheckBox->setChecked(false);
        emit setHomeScreenKpiInvisibility();     
    

在我的 mainwindow.cpp 中

MainWindow::MainWindow(QWidget *parent):
        QMainWindow(parent), ui(new Ui::MainWindow)

     ui->setupUi(this);
     m_ConSettingsDialog =new ConSettingsDialog();                  

    connect(m_ConSettingsDialog,SIGNAL(setHomeScreenKpiVisibility()),this,SLOT(setHomeScreenKpiVisibility()));     
    connect(m_ConSettingsDialog,SIGNAL(setHomeScreenKpiInvisibility()),this,SLOT(setHomeScreenKpiInvisibility()));


void MainWindow::setHomeScreenKpiVisibility()               


    ui->mylabel->setVisible(true);

void MainWindow::setHomeScreenKpiInvisibility()               


    ui->mylabel->setVisible(false);


代码构建完美,没有任何错误,但是当我运行它时,无论我取消选中该复选框多少次,标签都保持可见。当我打开设置时,我看到复选框被选中。

我尝试将 consettingsdialog.cpp 中的 kpi1CheckBox->setChecked(true); 更改为 kpi1CheckBox->setChecked(false);,但随后主屏幕中的标签也保持可见(根本不可见)。虽然在这种情况下,设置对话框中的复选框被设置为永久禁用。

现在感觉完全卡住了,我做错了什么?

【问题讨论】:

关于 setHomeScreenKpiVisibility 和 setHomeScreenKpiInvisibility 方法,你为什么要创建一个新的对话框?您不应该为 m_ConSettingsDialog 本身设置标签可见性吗? 什么时候真正调用ConSettingsDialog中的onSaveButton方法? 您可以尝试在 onSaveButton 方法中放置一个断点并检查它是否被调用? yup.. 它被调用好了.. 因为该页面中的其余设置参数在单击保存按钮后正在工作... 您发布的代码对我有用。我在尝试时犯的一个错误是,我忘记将 setHomeScreenKpiVisibility 和 setHomeScreenKpiInvisibility 声明为插槽。我当时面临着你所面临的类似问题。但是在解决了代码工作正常之后。还有一件事,是否需要 MainWindow::OnSaveButton 中的 setChecked 调用。你点击的时候已经设置好了对吧? 【参考方案1】:

当您调用onSaveButton() 时,我尝试阅读您的代码,它没有错,但是当您检查时,我认为您必须调用onSaveButton() 方法。您可以使用:

connect(kpi1CheckBox,SIGNAL(toggled(bool)),this,SLOT(onSaveButton(bool)));

请确保您连接所有复选框。

添加示例: 对话框.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui 
    class Dialog;


class Dialog : public QDialog

    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    void onsave(bool checked);
signals:
    void setHomeScreenKpiVisibility();
    void setHomeScreenKpiInvisibility();
;

#endif // DIALOG_H

对话框.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)

    ui->setupUi(this);
    connect(ui->checkBox,SIGNAL(toggled(bool)),this,SLOT(onsave(bool)));


Dialog::~Dialog()

    delete ui;


void Dialog::onsave(bool checked)

    if(ui->checkBox->isChecked()==true)
        
            ui->checkBox->setChecked(true);
            emit setHomeScreenKpiVisibility();
        
        else
        
            ui->checkBox->setChecked(false);
            emit setHomeScreenKpiInvisibility();
        

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui 
    class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    void show1();
    void enable1();
    void disable1();
;

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
Dialog *dialog;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    dialog = new Dialog(this);
    connect(ui->pushButton,SIGNAL(clicked()),dialog,SLOT(show()));
    connect(dialog,SIGNAL(setHomeScreenKpiVisibility()),this,SLOT(enable1()));
    connect(dialog,SIGNAL(setHomeScreenKpiInvisibility()),this,SLOT(disable1()));


MainWindow::~MainWindow()

    delete ui;


void MainWindow::show1()

    dialog->exec ();


void MainWindow::enable1()

    ui->label->setEnabled (true);


void MainWindow::disable1()

    ui->label->setEnabled (false);

【讨论】:

好吧,我试过了,但仍然没有任何反应。它和以前一样。我还有一个疑问,当我将信号连接到插槽时, this 属于 mainwindow 类吗?并且我的主窗口中没有 SaveButton。如果我的理解有误,请纠正我。 不,“THIS”这是“ConSettingsDialog”,当您检查“kpi1CheckBox”时,会调用“onSaveButton”插槽,它会检查“kpi1CheckBox”状态,并向主窗口发出信号。你明白吗? hmm.. 好的,但它仍然无法正常工作.. 还有更多见解吗?? 查看我在帖子中添加的示例。

以上是关于取消选中/选中 QCheckBox 后使 QLabel 不可见/可见的主要内容,如果未能解决你的问题,请参考以下文章

qt怎么用代码让radiobutton取消选中

复选框QCheckBox

PyQt4单选框QCheckBox

将QCheckBox的状态保存在文件中,程序重启时加载状态

pyqt4正确连接QCheckbox状态

使用PyQt中的QCheckBox或QComboBox更改小部件可见性