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

Я создал приложение, работающее в 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, это фон. Было бы здорово, если бы контент строки состояния нуждался в особой обработке, но также мог бы быть обработан в этом динамическом подходе.

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

0

Решение

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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]