2016-07-16 2 views
8

방금 ​​Qt 튜토리얼을 시작하고 있으며 초급 수준의 C++입니다. 나는 우리가 포인터를 클래스의 멤버에 액세스 할 수 있도록 -> 연산자를 사용할 수 있음을 이해'->'연산자를 사용하여 포인터로 객체 포인터에 액세스 할 수 있습니까?

ui->pushButton->setText("Hello"); 

: Qt는 튜토리얼에서, 버튼의 텍스트를 설정하는 문을 사용하는 예제가있다. 이 경우, pushButton->setText("Hello"),하지만 난 단지 ui->pushButton의 의미를 이해하지 못한다면, 어떤 대답은 uipushButton의 참조를 개최 설명하지만, 검색 할 수 있지만 어떻게 할 수 있습니까? pushButton은 객체에 대한 포인터이며 클래스의 멤버가 아니며 ->을 사용하여 객체 주소를 ui 포인터에 넣을 수 있습니까?

나쁜 영어로 불편을 끼쳐 드려 죄송합니다. 누군가가 나에게 명확한 설명을 줄 수 있기를 바랍니다. 미리 감사드립니다.

답변

8

로 기록 될 수있다.

자동 생성 된 헤더 파일은 출력 디렉토리에서 찾을 수 있습니다. 예를 들어 메인 윈도우는 ui_mainwindow.h입니다. 이 파일은 qmake을 실행 한 후에 만들어집니다. QT Creator를 사용하는 경우 자동으로 수행됩니다.

class Ui_MainWindow 
{ 
public: 
    QWidget *centralWidget; 
    QPushButton *pushButton; 
    QMenuBar *menuBar; 
    QToolBar *mainToolBar; 
    QStatusBar *statusBar; 
    ... 
}; 

ui 그래서 당신이 pushButton처럼 Ui_MainWindow 클래스의 멤버에 액세스하는 데에 ->을 사용할 수있는 Ui_MainWindow *입니다 : 여기

는 자동 생성 ui의 예입니다.

pushButton 그래서 당신은 setText()처럼 QPushButton 클래스의 멤버에 액세스하는 데에 ->을 사용할 수있는 QPushButton *입니다.

ui->pushButton->setText("Hello")이하는 것과 같습니다

Ui_MainWindow * ui = new Ui_MainWindow; 
... 
QPushButton * btn = ui->pushButton; 
btn->setText("Hello"); 

일부 수정 :

->는 포인터 일 :

->을 수행 할 수 없습니다하는 의 멤버에 액세스 단지 운영자 또는 구조체이며 포인터에 적용해야합니다. 인스턴스가있는 경우 . 연산자를 사용하여 멤버에 액세스해야합니다.

참조 : operators

마지막으로 similar question을 읽어야합니다.

+1

나는 그 머리 폴더를 점검했다, 그것은 존재했다. Qt가 백그라운드에서 작동하는 것과 같은 기본적인 지식이 부족하다고 생각합니다. 자세한 답변을 주셔서 감사합니다. 정말로 감사드립니다. – Vito

3

"화살표"연산자 ->은 개체를 가져 오기 위해 개체에 대한 포인터를 역 참조하는 데 사용됩니다. 따라서 변수 ui에 객체 포인터가 있고 객체의 구성원이 pushButton이면 ui->pushButton을 사용하여 pushButton 멤버에 액세스 할 수 있습니다. pushButton 멤버가 객체에 대한 포인터 인 경우 ui->pushButton->setText("Hello")과 같은 멤버에 다시 액세스하려면 ->을 다시 사용합니다.

"화살표"연산자는 기본적으로 역 참조 (단항 *) 및 점 (.) 멤버 액세스 연산자에 대한 구문 식 설탕입니다.

그래서 문

ui->pushButton->setText("Hello"); 

ui 포인터는 QT 창조주의 양식 편집기로 만든 XML에서 생성됩니다
(*(*ui).pushButton).setText("Hello"); 
+0

답변을 주셔서 감사합니다, 요아킴. 나는 "->"를 사용하여 객체에 대한 포인터를 역 참조 할 수 있음을 이해합니다. 그러나 "pushButton"이 "ui"의 멤버인지 확실하지 않습니다. "pushButton"이 Qt의 objectname이라는 것을 알았습니다. 그렇다면 "pushButton"이 "ui"의 멤버가되는 법. – Vito

+0

@Vito'pushButton'가'ui' 객체의 멤버가 아니면 컴파일러 오류가 발생합니다. –

+0

나는 지금 그것을 얻었다, 고마워한다 – Vito

관련 문제