我使用qtcreator创建了一个在QMainWindow中运行的应用程序,这是典型的方法。
我在状态栏中添加了两个“手动”(意思是:不使用表单编辑器)创建的qlabel:
在标题中:
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为“ timestamp”的此类实现中的其他地方,findChild()当然会返回0。它与在表单编辑器中使用QtCreator创建的其他QLabel一起正常工作,findChild()可以全部找到它们。状态栏小部件及其内容不是UI的子级吗?最终有人知道出路吗?
我想使用findChild按照我通过MQTT接收到的内容对命名方案进行通用填充,这就是背景。如果状态栏内容需要特殊处理,但也可以通过这种动态方法处理,那就太好了。
非常感谢
答案 0 :(得分:1)
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
}