Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

class declarations and namespaces in Qt 5 [duplicate]

Tags:

c++

qt

What are differences between:

namespace Ui
{
     class T;
}
class T
{
     //some content
}; 

and

namespace Ui
{
     class T 
     {
          //some content
     };
}

I use Qt Creator and the first construction is used in the default code which is generated for Qt Gui Application. In the example project I have two classes: class MyDialog : public QDialog and class MainWindow : public QMainWindow Each of them contains in the private section a pointer to the class:

class T: public Q
{
private:
          Ui::T *pointer;
}

What is purpose of such contruction ? When MainWindow class contains also a pointer to the MyDialog class then that pointer can't contain Ui:: qualifier:

private:
          Ui::MainWindow *ui;
          MyDialog *mDialog;

Why ?

like image 327
Irbis Avatar asked Oct 02 '22 17:10

Irbis


2 Answers

Interesting question, I didn't noticed this fact before, maybe because usually prefer building Ui objects by code.

Anyway, the construct is used to avoid the generation of 'service' class names: for instance, from an actual .h of mine

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
...
private:
    Ui::Dialog *ui;
}

Note the Ui::Dialog *ui;: that's the actual class that's forwarded by the top declaration (that inside the namespace Ui). So QtCreator avoid to build an arbitrary symbol.

A nice trick, I think.

That forwarded class hides the gory details required by runtime construction of the GUI: you'll find in your build directory a .h (in my case, a ui_dialog.h) containing, for instance

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QVBoxLayout *verticalLayout;
    QTabWidget *tabWidget;
...
};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE
like image 84
CapelliC Avatar answered Oct 13 '22 10:10

CapelliC


namespaces are there to protect your code from aliasing classes, if you wrap your class in a namespace you can only access it through the use of that namespace, thus "class t" is not the same as "namespace::class t"

like image 20
LemonCool Avatar answered Oct 13 '22 12:10

LemonCool