有人如何使用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);
}
最终结果是,我在对话框中有一个QLabel列表,我想保存文本。我在其他地方成功使用了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找到标签。
答案 0 :(得分:1)
如果你的对象没有命名&#34; mylabel _&#34;确切地说,我不认为这个功能会起作用。如果您想根据某些正则表达式查找标签,则需要使用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;
...
};