QObject::findChild returns 0 用于添加到状态栏的 QLabel

QObject::findChild returns 0 for QLabels added to statusbar

我使用 qtcreator 在 QMainWindow 中创建了一个应用程序 运行,这是典型的方式。

我向状态栏添加了两个 'manually'(意思是:不是使用表单编辑器)创建的 qlabels:

在header中:

QLabel *label_timestamp;
QLabel *contentLabel_timestamp;

在构造函数中:

MainWin::MainWin(const CmdLineOptions &opts, QWidget *parent)
: QMainWindow(parent),
  ui(new Ui::MainWin),
  m_connectionStatusLabel(new QLabel),
  m_client(new QMqttClient),
  m_mqttmanager(new MQTTManager(m_client)),
  m_mqttServerName("localhost")
{
    ui->setupUi(this);

    label_timestamp = new QLabel(this);
    contentLabel_timestamp = new QLabel(this);

    label_timestamp->setText("system time");
    contentLabel_timestamp->setText("dd.mm.yyyy, hh:mm:ss:zzz"); /* just testing output */

    statusBar()->addPermanentWidget(label_timestamp);
    statusBar()->addPermanentWidget(contentLabel_timestamp);
}

如果我做一个

Label *label = findChild<QLabel *>(QString("contentLabel_")+objName);

在这个 class 实现的其他地方,objName 是 'timestamp',当然,findChild() returns 0。它与在表单编辑器中使用 QtCreator 创建的其他 QLabel 一起工作正常, findChild() 找到它们。状态栏小部件及其内容不也是 ui 的 child 吗?有人最终知道出路吗?

我想使用 findChild 按照命名方案使用我通过 MQTT 收到的内容一般地填充我的标签,这是背景。如果状态栏内容需要特殊处理但也可以用这种动态方法处理,那就太好了。

非常感谢

findChild uses the objectName, in the case of Qt Creator this establishes it in the MOC,但在你的情况下你必须建立它:

label_timestamp = new QLabel(this);
contentLabel_timestamp->setObjectName("label_timestamp");
contentLabel_timestamp = new QLabel(this);
contentLabel_timestamp->setObjectName("contentLabel_timestamp");

然后您可以使用以下方法恢复它:

QLabel *label_1 = findChild<QLabel *>("label_timestamp");
if(label_1){
    // some code
}
QLabel *label_2 = findChild<QLabel *>("contentLabel_timestamp");
if(label_2){
    // some code
}