2013-09-06 10 views
8

Ich bin neu in C++ und Qt und ich versuche, auf ein Widget von einer Elternklasse zugreifen.C++ Zugriff auf Eltern Widgets von einer Funktion

Hier ist meine mainwindow.cpp

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

ich eine andere Klasse, und ich versuche, in dieser Klasse ein Widget von „ui“ zuzugreifen. Wie so:

Das gibt mir einen Fehler, der besagt, dass die Methoden und Felder nicht aufgelöst werden konnten. Aber wenn ich die Zeile parent->ui->menuSL->setCurrentIndex(0); in den Konstruktor setze, gibt es kein Problem.

Würde jemand bitte meinen Fehler aufzeigen?

+2

Sie sollten lieber ein Signal in Ihrer 'DashBoard :: select()' -Funktion ausgeben und es entweder mit dem 'setCurrentIndex (int)' -Schlitz Ihres 'menSL' -Objekts oder mit einer Funktion in Ihrer' MainWindow'-Klasse verbinden. – thuga

+0

Ich stimme mit thuga überein. Ein Signal von DashBoard zu emittieren ist ein besserer Ansatz. – drescherjm

+1

Ich würde nicht empfehlen, direkt auf 'ui' Ihrer Eltern zuzugreifen. Stattdessen leiten Sie Ihre Eltern von einer Schnittstelle mit definierten Accessor-Methoden ab, die von Ihrem Kind aufgerufen werden können. Beispielaufruf: dynamic_cast (parent()) -> SetMenu (0); Oder verwenden Sie das Signal/Slot-Konzept. – bkausbk

Antwort

2

Innerhalb Ihrer Select-Methode versuchen Sie, eine Variable mit dem Namen parent zu verwenden. Aber Sie brauchen die QObject::parent() Methode.

Darüber hinaus müssen Sie das übergeordnete Element in QMainWindow umwandeln.

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

Sie können nur auf ui zugreifen, wenn es öffentlich ist.

Insgesamt denke ich, dass Sie eine Methode in Ihnen MainWindow Klasse bereitstellen sollten, die die gewünschte Operation ausführt.

+0

Ich weiß nicht, wirft nicht die Rückgabe von parent() auf der rechten Seite Klasse Art besiegt den Zweck von wie nicht überschreiben Eltern() zu beginnen mit? – n611x007

3

Aus dem Code kann man schließen, dass die Klasse DashBoardQObject erbt. Das parent Feld eines QObject ist als ein Zeiger auf eine QObject definiert. Wenn Sie parent->ui->menuSL->setCurrentIndex(0); innerhalb einer Methode der Klasse DashBoard aufrufen, gehen Sie davon aus, dass QObject ein Mitglied mit der Bezeichnung ui definiert, das nicht wahr ist.

werfen gerade Eltern auf diese Weise:

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

oder diese ein:

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

im Konstruktor Sie nicht den Fehler, weil parent als Zeiger auf ein Objekt der definiert ist Klasse MainWindow und dann an den Konstruktor QObject übergeben.

Vergessen Sie nicht, ui öffentlich zu machen und den automatisch generierten UI-Header aufzunehmen, wenn Sie Qt Designer (in Ihrem Fall wahrscheinlich "ui_mainwindow.h") in der DashBoard cpp-Datei verwenden.

HINWEIS: Ich versuche nur, Ihre Frage zu beantworten, aber ich ermutige Sie, die Art, wie Sie das tun, zu überprüfen. Es gibt mehrere Möglichkeiten, dasselbe mit einem konsistenteren OO-Design zu erreichen.

+0

, die diese Fehler erzeugt: ungültige Verwendung der Member-Funktion (haben Sie vergessen, die '()'?) – user2444217

+1

Machen Sie 'ui' öffentlich und enthalten' #include "ui_mainwindow.h" 'in das DashBoard cpp. – mhcuervo

+2

'((MainWindow *) (Eltern())) -> ...' funktioniert tatsächlich, danke. – TranslucentCloud

Verwandte Themen