【问题标题】:How to reference an objectName using a QString?如何使用 QString 引用 objectName?
【发布时间】:2017-02-26 19:21:20
【问题描述】:

如何使用 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);
}

objectName 只是一个 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 如何转换为 objectName .这是更新后的代码,但它仍然没有返回任何结果。

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 函数实施的。但是,我不知道为什么它没有根据我作为 findChildren 的参数输入的 QString 找到标签。

【问题讨论】:

  • 并非所有内容都必须以 ui-&gt; 开头。不是局部变量。
  • 运行 findChildren 后您的列表是否包含任何标签?
  • 另外,查看对话框代码会很有帮助。
  • 在上面添加的代码中,您尝试引用一个字符串,就像它是一个对象一样 (ui->thisString->text())。你不能那样做。字符串和变量名不同。
  • 您的对象是否准确命名为“mylabel_”?如果不是,您将需要使用 QRegExp,而不是字符串:doc.qt.io/qt-5/qobject.html#findChildren-1

标签: c++ qt qstring qobject


【解决方案1】:

如果您的对象没有准确命名为“mylabel_”,我认为该功能不会起作用。如果要根据一些正则表达式查找标签,则需要使用 findChildren 函数的QRegExp version

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

由于您通过名称获取对象,因此您可能也可以记住类型。从the documentation 看来,Qt 会这样做,然后将对象转换为您指定的类型。向上转型往往有点臭。

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

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

【讨论】:

  • 如果我需要将 QLabels 映射用于其他参考目的,映射会有所帮助。但是,我只需要从这组标签中的每一个中提取文本。我怀疑 findChildren 是最适合此目的的方法,但根据文档,我不确定我是否正确实施它。
猜你喜欢
  • 2015-11-06
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多