2013-09-06 1 views
8

Jestem nowy w C++ i Qt i próbuję uzyskać dostęp do widgetu z klasy nadrzędnej.C++ dostęp do widżetów nadrzędnych z funkcji

Oto moja mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
    , ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

mam inną klasę, a ja staram się dostęp widget z „Ul” w tej klasie. Podobnie jak:

DashBoard::DashBoard(MainWindow *parent) : QObject(parent) 
{ 
} 

void DashBoard::select() 
{ 
    parent->ui->menuSL->setCurrentIndex(0); 
} 

Daje mi to błąd, że metod i pól nie można rozwiązać. Ale kiedy wstawiam linię parent->ui->menuSL->setCurrentIndex(0); do konstruktora, nie ma problemu.

Czy ktoś mógłby wskazać mój błąd?

+2

Powinieneś raczej emitować sygnał w swojej funkcji 'DashBoard :: select()' i podłącz go do swojego '' menSL' obiektu 'setCurrentIndex (int)' lub do funkcji w twojej klasie 'MainWindow'. – thuga

+0

Zgadzam się z thuga. Emitowanie sygnału z DashBoard jest lepszym podejściem. – drescherjm

+1

Nie polecam bezpośredniego dostępu do 'ui' twojego rodzica. Zamiast tego wyprowadź swojego rodzica z interfejsu ze zdefiniowanymi metodami dostępowymi, które można wywołać z twojego dziecka. Przykładowe wywołanie: dynamic_cast (parent()) -> SetMenu (0); Lub użyj koncepcji sygnału/gniazda. – bkausbk

Odpowiedz

2

W ramach wybranej metody próbujesz użyć zmiennej o nazwie parent. Ale potrzebujesz metody QObject::parent().

Ponadto należy rzucić rodzica na numer QMainWindow.

void DashBoard::select() { 
    QMainWindow* parent = qobject_cast<QMainWindow>(this->parent()); 
    if (parent == 0) { return; } // or some other error handling 
    parent->ui->menuSL->setCurrentIndex(0); 
} 

Możesz uzyskać dostęp tylko do ui, jeśli jest publiczny.

Podsumowując, uważam, że powinieneś podać metodę w swojej klasie MainWindow, która wykonuje operację, którą chcesz.

+0

Nie wiem, nie rzutuje return of parent() w prawo rodzaj klasy pokonuje cel jak nie nadpisanie rodzica() na początek? – n611x007

3

Z kodu można wywnioskować, że klasa DashBoard dziedziczy QObject. Pole parent obiektu QObject jest zdefiniowane jako wskaźnik do QObject, więc po wywołaniu parent->ui->menuSL->setCurrentIndex(0); w metodzie klasy DashBoard zakłada się, że QObject definiuje element o nazwie ui, który nie jest prawdziwy.

Wystarczy rzucić rodzica w ten sposób:

((MainWindow*)(parent()))->ui->menuSL->setCurrentIndex(0); 

czy to jedno:

MainWindow* parent = qobject_cast<MainWindow*>(this->parent()); 
// check parent is not null 
parent->ui->menuSL->setCurrentIndex(0); 

W konstruktorze ty nie widzisz błąd, ponieważ parent jest zdefiniowany jako wskaźnik do obiektu z klasa MainWindow, a następnie przekazane do konstruktora QObject.

Nie zapomnij, aby ui publicznej oraz włączenie automatycznego wygenerowany nagłówek w przypadku korzystania z interfejsu Qt Designer (w twoim przypadku prawdopodobnie "ui_mainwindow.h") w pliku DashBoard CPP.

UWAGA: Próbuję odpowiedzieć na twoje pytanie, ale zachęcam do zapoznania się z tym, co robisz. Istnieje kilka sposobów na osiągnięcie tego samego przy bardziej spójnym projekcie OO.

+0

, która produkuje ten błąd: nieprawidłowe korzystanie z funkcji członka (nie zapomnieć o „()”?) – user2444217

+1

Marka 'ui' publicznych i obejmują' #include „ui_mainwindow.h” 'w KPP desce rozdzielczej. – mhcuervo

+2

'((MainWindow *) (parent())) -> ...' faktycznie działa, dziękuję. – TranslucentCloud