我使用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接收的内容来一般地填充我的标签,这是背景。如果状态栏内容需要特殊处理,但也可以采用这种动态方法进行处理,那就太好了。

非常感谢

最佳答案

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
}

关于c++ - QObject::findChild对于添加到状态栏的QLabel返回0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53123327/

10-11 21:38