首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用objectName引用QString?

如何使用objectName引用QString?
EN

Stack Overflow用户
提问于 2017-02-26 19:21:20
回答 1查看 1.8K关注 0票数 0

如何使用QObject引用QString?我试图在Qt文档和这个站点上类似的答案的基础上完成几种不同的方法,但都没有用。

代码语言:javascript
复制
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,但是我可能并不完全理解关于这个函数的文档。

代码语言:javascript
复制
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。这是更新的代码,但仍然不返回任何结果。

代码语言:javascript
复制
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参数的标签。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-26 19:46:19

如果您的对象没有准确地命名为"mylabel_“,我认为该函数将无法工作。如果希望基于某个正则表达式查找标签,则需要使用QRegExp版本函数的findChildren函数。

代码语言:javascript
复制
QList<QLabel *> labels = this->findChildren<QLabel *>(QRegExp("mylabel_*"));

尽管如此,您始终可以使用普通的c++按名称索引对象。这样做的典型方法是用地图。这可能与Qt在幕后所做的类似。如果您有相同类型的一组已知对象,这将是相当有效的。

代码语言:javascript
复制
#include <map>

...

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

...

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

代码语言:javascript
复制
std::map<QString, QObject*> {
    { "myLabel", label },
    { "myWidget", widget },
    { "myButton", button }
};

因为您正在按名称获取对象,所以您可能也会记住类型。从文献资料来看,Qt似乎是这样做的,然后将对象转换为您指定的类型。上盖往往有点臭味。

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

代码语言:javascript
复制
class MyDialog : public QDialog
{
public:
    ...
    void addLabel(QLabel* label);
    void saveLabelText(QLabel* label);
    ...
private:
    ...
    QLabel* _myLabel;
    ...
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42473050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档