如何使用QString引用对象名称



有人如何使用QString引用QOBject?我试图根据QT文档和本网站上的类似答案来完成几种不同的方法。

QString string = "mylabel_"
for(int i = 0; i < my.count(); i++)
{
    QString thisString = string + QString::number(i);
    QString labelText = ui->thisString->text();  //'ui' has no members named 'thisString'
    functions::saveLine(&nameFile, labelText);
}

对象名称只是一个QString,但是使用它不起作用。我也尝试使用Findchildren,但我可能不完全了解此功能的文档。

QList<QWidget *> labels = dialog.findChildren<QWidget *>("mylabel_");
for(int i = 0; i < labels.count(); i++)
{
    QString labelText = ui->labels[i]->text(); //'dialog' has no member named 'labels'
    functions::saveLine(&nameFile, labelText);
}

最终结果是,我的对话框中有一个Qlabels列表,我想保存文本。我已经成功地使用了Saveline功能,但是要获得以上错误来引用对象的错误。任何建议都会非常有帮助。

更新:我能够修复它,以免返回任何错误,但仍然不会返回任何结果,所以我猜这个问题现在在Findchildren方法中更具针对性,以及QString如何翻译成对象名称。这是更新的代码,但仍未返回任何结果。

QList<QLabel *> labels = this->findChildren<QLabel *>("mylabel_");
for(int i = 0; i < labels.count(); i++)
{
    QString labelText = labels.at(i)->text();
    functions::saveLine(&nameFile, labelText);
}

因此,如果我能够找到以objectName =" mylabel_"开头的所有标签,然后将它们放入Qlist中,那么这将能够从它们中提取文本并将其传递给Saveline函数我实施的。但是,我不知道为什么它没有找到基于我投入的QString的标签,作为Findchildren的论点。

如果您的对象未命名为" mylabel_",我认为该函数不起作用。如果您想根据一些正则表达式找到标签,则需要使用Findchildren函数的QREGEXP版本。

QList<QLabel *> labels = this->findChildren<QLabel *>(QRegExp("mylabel_*"));

也就是说,您始终可以使用普通的C 按名称索引对象。这样做的典型方法是在地图上。它可能与QT在封面下所做的事情相似。如果您具有相同类型的已知对象,这将是相当有效的。

#include <map>
...
std::map<QString, QLabel*> {
    { "myLabel0", label0 },
    { "myLabel1", label1 },
    { "myLabel2", label2 }
};
...

如果您聪明,您甚至可以通过存储指向普通基类的指针来存储不同类型...

std::map<QString, QObject*> {
    { "myLabel", label },
    { "myWidget", widget },
    { "myButton", button }
};

由于您是按名称获取对象的,因此您也可以记住该类型。从文档中,看起来QT可以做到这一点,然后将对象投入到您指定的类型上。升级往往有点臭。

但是,如果您不需要存储大量对象,则可以将对话框子插入,然后只需将标签的指针存储在成员变量中即可。子类通常是一个好主意。这可以使您的代码更加重复使用。

class MyDialog : public QDialog
{
public:
    ...
    void addLabel(QLabel* label);
    void saveLabelText(QLabel* label);
    ...
private:
    ...
    QLabel* _myLabel;
    ...
};

相关内容

最新更新