簡體   English   中英

如何使用QString引用objectName?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM