QObject :: findChild возвращает 0 для QLabels, добавленных в строку состояния - PullRequest
0 голосов
/ 02 ноября 2018

Я создал приложение, работающее в QMainWindow, используя qtcreator, поэтому типичный способ.

Я добавил два «вручную» (то есть: не с редактором форм) созданных qlabels в строку состояния:

в шапке:

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);

в других местах реализации этого класса, где objName является меткой времени, конечно, findChild () возвращает 0. Он отлично работает с другими QLabels, созданными с использованием QtCreator в редакторе форм, findChild () находит их все. Разве виджет строки состояния и его содержимое не являются потомками пользовательского интерфейса? Кто-нибудь в конце концов знает выход оттуда?

Я хочу использовать findChild для общего заполнения моих меток в соответствии со схемой именования контентом, который я получаю через MQTT, это фон. Было бы замечательно, если бы контент строки состояния нуждался в особой обработке, но также мог бы обрабатываться и в этом динамическом подходе.

Большое спасибо

1 Ответ

0 голосов
/ 02 ноября 2018

findChild использует objectName , в случае Qt Creator это устанавливается в 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
}
...