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

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

我的目标是,如果在consettings对话框中选中或未选中相应的复选框,则使主窗口中的某些标签可见/不可见。

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

在我的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);进行了尝试,但是主屏幕中的标签仍保持可见(根本不可见)。尽管在这种情况下,设置对话框中的复选框被永久禁用。

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

最佳答案

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

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

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

添加示例:
对话框
#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();
        }
}

主窗口
#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

主窗口
#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);
}

关于c++ - 取消选中/选中QCheckBox后使QLabel不可见/可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28207527/

10-14 06:39