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