[英]How to reference an objectName using a 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);
}
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的標簽。
如果您的對象未正確命名為“ 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;
...
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.