C++ Qt,在构造函数外部修改widgets属性时出现问题

C++ Qt,在构造函数外部修改widgets属性时出现问题,c++,qt,C++,Qt,我想知道是否有人能告诉我这里到底发生了什么。我已经包含了一个简单配置对话框的头文件和实现文件。问题是在updateAutoSaveGroupBox插槽中,我无法访问或更改页面上小部件的任何属性。也就是说,如果没有选中复选框,我想禁用一些小部件,但是当我尝试设置它们时,我会遇到读访问冲突。在这件事上的任何帮助都将不胜感激。这两行中都存在问题(注释掉了,所以它将暂时运行,不会引发异常) configWidget.h class EnigmaConfigGeneralEnvironmentWidget

我想知道是否有人能告诉我这里到底发生了什么。我已经包含了一个简单配置对话框的头文件和实现文件。问题是在updateAutoSaveGroupBox插槽中,我无法访问或更改页面上小部件的任何属性。也就是说,如果没有选中复选框,我想禁用一些小部件,但是当我尝试设置它们时,我会遇到读访问冲突。在这件事上的任何帮助都将不胜感激。这两行中都存在问题(注释掉了,所以它将暂时运行,不会引发异常)

configWidget.h

class EnigmaConfigGeneralEnvironmentWidget : public QWidget
{
Q_OBJECT
public:
explicit EnigmaConfigGeneralEnvironmentWidget(QWidget *parent = 0);
~EnigmaConfigGeneralEnvironmentWidget();

signals:
void setAutoSaveIsEnabledSignal(bool autoSaveIsEnabled);

public slots:
void setAutoSaveIsEnabled(bool autoSaveIsEnabled){_AutoSaveIsenabled = autoSaveIsEnabled;}
bool getAutoSaveIsEnabled(){return _AutoSaveIsenabled;}

void updateAutoSaveGroupBox(bool autoSaveIsEnabled);

private:
void makeConnections();
void readSettings();
void writeSettings();
void createMainWidget();

QGroupBox *uiGroupBox;
QStringList localList;
QLabel *localLabel;
QComboBox *localeComboBox;
QHBoxLayout *localSelectionHLayout;
QGroupBox *systemGroupBox;
QCheckBox *autoSaveCheckBox;
QLabel *autoSaveLabel;
QSpinBox *autoSaveSpinBox;
QHBoxLayout *autoSaveHLayout;

bool _AutoSaveIsenabled;
};
ConfigWidget.cpp

#include "enigmaconfiggeneralenvironmentwidget.h"

#include <QtWidgets>

EnigmaConfigGeneralEnvironmentWidget::EnigmaConfigGeneralEnvironmentWidget(QWidget *parent) :
QWidget(parent)
{
makeConnections();
readSettings();

createMainWidget();
}

EnigmaConfigGeneralEnvironmentWidget::~EnigmaConfigGeneralEnvironmentWidget()
{
writeSettings();
}

void EnigmaConfigGeneralEnvironmentWidget::makeConnections()
    {connect(this,SIGNAL(setAutoSaveIsEnabledSignal(bool)),this,SLOT(setAutoSaveIsEnabled(bool))    );
connect(this,SIGNAL(setAutoSaveIsEnabledSignal(bool)),this,SLOT(updateAutoSaveGroupBox(bool))    );
}

void EnigmaConfigGeneralEnvironmentWidget::readSettings()
{
QSettings settings;
settings.beginGroup(tr("UI.Config.Environment.General"));
bool autoSaveIsEnabled = settings.value("autoSaveIsEnabled",bool(true)).toBool();
setAutoSaveIsEnabledSignal(autoSaveIsEnabled);
settings.endGroup();
}

void EnigmaConfigGeneralEnvironmentWidget::writeSettings()
{
QSettings settings;
settings.beginGroup(tr("UI.Config.Environment.General"));
settings.setValue("autoSaveIsEnabled",getAutoSaveIsEnabled());
settings.endGroup();
}

void EnigmaConfigGeneralEnvironmentWidget::createMainWidget()
{
localList.append(tr("Danish - ???"));
localList.append(tr("English - Australia"));
localList.append(tr("English - Canada"));
localList.append(tr("English - USA"));
localList.append(tr("English - UK"));
localList.append(tr("Finnish - Finland"));
localList.append(tr("French - Canada"));
localList.append(tr("French - France"));
localList.append(tr("Norwegian - ???"));
localList.append(tr("Swedish - ???"));

uiGroupBox = new QGroupBox();
uiGroupBox->setTitle(tr("UI Settings"));

localLabel= new QLabel();
localLabel->setText(tr("Select a language: "));

localeComboBox = new QComboBox();
localeComboBox->addItems(localList);

localSelectionHLayout = new QHBoxLayout(uiGroupBox);
localSelectionHLayout->addWidget(localLabel);
localSelectionHLayout->addWidget(localeComboBox);

systemGroupBox = new QGroupBox();
systemGroupBox->setTitle(tr("System Settigns"));

autoSaveCheckBox = new QCheckBox();
autoSaveCheckBox->setText(tr("Auto-Save Enabled: "));
autoSaveCheckBox->setChecked(getAutoSaveIsEnabled());
        connect(autoSaveCheckBox,SIGNAL(clicked(bool)),this,SIGNAL(setAutoSaveIsEnabledSignal(bool)));
autoSaveLabel = new QLabel(this);
autoSaveLabel->setText(tr("Auto-Save Interval is Every: "));

autoSaveSpinBox = new QSpinBox();
autoSaveSpinBox->setSuffix(tr("Mins."));
autoSaveSpinBox->setAccelerated(true);

autoSaveHLayout = new QHBoxLayout(systemGroupBox);
autoSaveHLayout->addWidget(autoSaveCheckBox);
autoSaveHLayout->addWidget(autoSaveLabel);
autoSaveHLayout->addWidget(autoSaveSpinBox);

QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->addWidget(uiGroupBox);
vLayout->addWidget(systemGroupBox);
}

void EnigmaConfigGeneralEnvironmentWidget::updateAutoSaveGroupBox(bool autoSaveIsEnabled)
{
qDebug() << "debug " << autoSaveIsEnabled;
//autoSaveLabel->setDisabled(autoSaveIsEnabled);
//autoSaveSpinBox->setDisabled(getAutoSaveIsEnabled());
}
#包括“enigmaconfiggeneralenvironmentwidget.h”
#包括
EnigmaConfigGeneralEnvironmentWidget::EnigmaConfigGeneralEnvironmentWidget(QWidget*父项):
QWidget(父级)
{
makeConnections();
readSettings();
createMainWidget();
}
EnigmaConfigGeneralEnvironmentWidget::~EnigmaConfigGeneralEnvironmentWidget()
{
写设置();
}
void EnigmaConfigGeneralEnvironmentWidget::makeConnections()
{连接(此,信号(setAutoSaveIsEnabledSignal(bool)),此,插槽(setAutoSaveIsEnabled(bool)));
连接(此,信号(setAutoSaveIsEnabledSignal(bool)),此,插槽(updateAutoSaveGroupBox(bool));
}
void EnigmaConfigGeneralEnvironmentWidget::readSettings()
{
QSettings设置;
settings.beginGroup(tr(“UI.Config.Environment.General”);
bool autoSaveIsEnabled=settings.value(“autoSaveIsEnabled”,bool(true)).toBool();
设置autoSaveIsEnabled信号(autoSaveIsEnabled);
settings.endGroup();
}
void EnigmaConfigGeneralEnvironmentWidget::writeSettings()
{
QSettings设置;
settings.beginGroup(tr(“UI.Config.Environment.General”);
setValue(“autoSaveIsEnabled”,getAutoSaveIsEnabled());
settings.endGroup();
}
void EnigmaConfigGeneralEnvironmentWidget::createMainWidget()
{
localList.append(tr(“丹麦语-?”);
localList.append(tr(“英语-澳大利亚”);
localList.append(tr(“English-Canada”);
localList.append(tr(“英语-美国”);
localList.append(tr(“English-UK”);
localList.append(tr(“Finnish-Finland”);
localList.append(tr(“法语-加拿大”);
localList.append(tr(“法语-法国”);
localList.append(tr(“挪威语-?”);
localList.append(tr(“瑞典语-?”);
uiGroupBox=新的QGroupBox();
uiGroupBox->setTitle(tr(“UI设置”);
localLabel=新的QLabel();
localLabel->setText(tr(“选择语言:”);
localeComboBox=新的QComboBox();
localeComboBox->addItems(localList);
localSelectionHLayout=新的QHBoxLayout(uiGroupBox);
localSelectionHLayout->addWidget(localLabel);
localSelectionHLayout->addWidget(localeComboBox);
systemGroupBox=新的QGroupBox();
systemGroupBox->setTitle(tr(“系统设置”);
autoSaveCheckBox=新的QCheckBox();
自动保存复选框->设置文本(tr(“自动保存已启用:”);
autoSaveCheckBox->setChecked(getAutoSaveIsEnabled());
连接(autoSaveCheckBox,信号(单击(bool)),此,信号(设置AutoSaveIsEnabledSignal(bool)));
autoSaveLabel=新的QLabel(此);
autoSaveLabel->setText(tr(“自动保存间隔为每:”);
autoSaveSpinBox=新QSpinBox();
autoSaveSpinBox->setSuffix(tr(“分钟”);
autoSaveSpinBox->setAccelerated(真);
autoSaveHLayout=新的QHBoxLayout(systemGroupBox);
自动保存布局->添加小部件(自动保存复选框);
autoSaveHLayout->addWidget(autoSaveLabel);
autoSaveHLayout->addWidget(autoSaveSpinBox);
QVBoxLayout*vLayout=新的QVBoxLayout(此);
vLayout->addWidget(uiGroupBox);
vLayout->addWidget(systemGroupBox);
}
void EnigmaConfigGeneralEnvironmentWidget::updateAutoSaveGroupBox(bool autoSaveIsEnabled)
{
qDebug()setDisabled(getAutoSaveIsEnabled());
}
发现了它:

void EnigmaConfigGeneralEnvironmentWidget::readSettings()
{
QSettings settings;
settings.beginGroup(tr("UI.Config.Environment.General"));
bool autoSaveIsEnabled = settings.value("autoSaveIsEnabled",bool(true)).toBool();
setAutoSaveIsEnabledSignal(autoSaveIsEnabled);
settings.endGroup();
}
您在此处(信号)调用的是
void setautosaveisenablesignal(bool)
,而不是
void setAutoSaveIsEnabled(bool)
(实际设置器)。因此,成员变量仍然未初始化


提醒自己:不要将信号命名为设置器,使用例如
void autoSaveIsEnabledChanged(bool)

快速浏览不会发现任何错误。尝试在GDB中运行您的程序。谢谢,这似乎解决了问题,但您能解释一下吗。我在我的程序的其他部分也用同样的方法做了,没有阻力,为什么会有问题呢?我的想法是为setter插槽设置一个信号,为了一致性,总是以这样的方式调用信号,即不必直接调用插槽,可以从已经连接到其他小部件的相同信号调用插槽。嗯,不知道。但为什么直接打电话给老虎机是个问题呢?通过信号增加了另一个往返。只是我的一些小部件和操作上的信号/插槽连接方法已经需要这些信号,所以我只是想,因为我已经在某些情况下使用了信号,所以总是调用这些信号来预执行taskWell是最方便的方法,但是为什么方便呢?它还通过QMetaObject::invokeMethod等添加了另一个往返。。直接给设定者打电话很方便。我的意思是作为写作风格的惯例。虽然性能是一个因素,但与保持一个小团队在同一页面上对QT来说都是非常新的优势相比,在这样的情况下,性能是很小的。我也是一个年轻的程序员,没有很多经验,也没有完成过很多项目,没有完成一个项目,性能根本不重要,所以我真正关注的是为什么它在语法上是错误的。当我知道更多的时候,一旦我真的有一些东西需要优化,我就会进行优化,尽管我说过你可能是对的,我可能只是想得太多了。
void EnigmaConfigGeneralEnvironmentWidget::readSettings()
{
QSettings settings;
settings.beginGroup(tr("UI.Config.Environment.General"));
bool autoSaveIsEnabled = settings.value("autoSaveIsEnabled",bool(true)).toBool();
setAutoSaveIsEnabledSignal(autoSaveIsEnabled);
settings.endGroup();
}