2017-02-26 2 views
0

누군가 QString을 사용하여 QObject를 참조 할 수 있습니까? 이 사이트에서 Qt 문서 및 유사한 답변을 기반으로 여러 가지 방법으로이 작업을 수행하려고 시도했습니다.QString을 사용하여 objectName을 참조하는 방법은 무엇입니까?

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

그래서 개체 이름 = "mylabel_"로 시작하는 모든 레이블을 발견하고, QList에 넣어 할 수 있다면, 이것은 saveLine에 그들로부터 텍스트를 끌어 통과 할 수있을 것 함수를 구현했습니다. 그러나 findChildren에 대한 인수로 넣은 QString을 기반으로 레이블을 찾지 못하는 이유를 알 수 없습니다.

+0

모든 것이 'ui->'로 시작해야하는 것은 아닙니다. 지역 변수가 아닙니다. – LogicStuff

+0

findChildren을 실행 한 후 목록에 레이블이 있습니까? – vincent

+0

또한 대화 코드를 보는 것이 도움이됩니다. – vincent

답변

1

개체의 이름이 "mylabel_"이 아닌 경우 정확하게 작동한다고 생각하지 않습니다. 일부 정규 표현식을 기반으로 레이블을 찾으려면 QRegExp version의 findChildren 함수를 사용해야합니다.

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; 
    ... 
}; 
+0

다른 참조 목적으로 매핑 된 QLabels가 필요한 경우 매핑이 도움이됩니다. 그러나이 레이블 그룹 각각에서 텍스트를 가져와야합니다. 나는 findChildren이이 목적에 가장 적합한 메소드라고 생각하지만, 문서를 기반으로, 제대로 구현하고 있는지 확신 할 수 없다. –

관련 문제