2011-01-31 15 views
10
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

En esta sección del código, después de : ¿quéUna pregunta novato en Qt

QMainWindow(parent), 
ui(new Ui::MainWindow) 

quiere decir?

Respuesta

11

Esto es realmente una pregunta de C++. Lo que estás viendo se llama initialization lists. El QMainWindow(parent) llama a ese constructor para la superclase MainWindow (QMainWindow) y ui(new Ui::MainWindow) construye el miembro ui.

+0

así que esto solo se usa en la función de construcción? o puede ser utilizado en cualquier tipo de fucntions? – Sean

+1

Solo en un constructor. – TonyK

+0

.. pero en todo tipo de constructores, incluidos _copy constructors_. – MSalters

6

Estas dos líneas son la llamada lista de inicialización y se ejecutan en el momento de "creación" de cada instancia de esta clase. Cada clase que hereda otro debería contener una llamada al constructor de la superclase en esta lista.

También podría escribir:

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

que se podía encontrar mejor legible. Pero el uso de una lista de inicialización es ligeramente más rápido y está siendo optimizado por el compilador. Tenga en cuenta que estas listas solo se pueden usar en constructores y que no se puede llamar a ninguna función del objeto, porque aún no se "activa". Pero es posible establecer el valor de algunos atributos y se refieren a ellos en las siguientes declaraciones (para evitar la redundancia de código, por ejemplo), como en el siguiente ejemplo:

#define DEFAULT_VALUE 1.0 

class MyClass { 

public: 
    MyClass() : 
     value1(DEFAULT_VALUE), 
     value2(value1) 
    { 
    } 

    MyClass(qreal value) : 
     value1(value), 
     value2(value1) 
    { 
    } 

private: 
    qreal value1; 
    qreal value2; 
}; 

Tenga en cuenta que la mayoría de los compiladores le dan una advertencia si el orden de los miembros en su lista de inicialización no coinciden con el orden en la definición de la clase.

7

A modo de explicación adicional, observamos que la clase generada por el compilador de interfaz de usuario también se llama (en este caso) MainWindow, pero pertenece al espacio de nombres Ui, por lo que su nombre completo es Ui::MainWindow. Esto no es lo mismo que la clase MainWindow que hereda de QMainWindow. Sin embargo, la clase derivada de QMainWindow tiene un puntero de miembro (llamado ui) a Ui::MainWindow, que se inicializa en el constructor, como se explicó anteriormente. Eche un vistazo al archivo generado en uic ui_mainwindow.h para ver cómo encajan todas las piezas juntas. Tenga en cuenta también que los miembros de Ui::MainWindow son todos públicos y por lo tanto totalmente accesibles dentro de MainWindow.

Un diseño alternativo es fusionar la identidad de las dos clases MainWindow utilizando herencia múltiple, derivando su propio MainWindow tanto QMainWindow y Ui::MainWindow. Sin embargo, el código generado por la versión actual de QtCreator sigue el patrón de composición en lugar del patrón de herencia.

+0

+1 - esta respuesta fue un buen recordatorio de que Ui :: MainWindow es un producto del MOC y no está realmente declarado en MainWindow.h - la declaración que se parece a ... namespace Ui { clase MainWindow; } ... es en realidad una clase de stub para acelerar la compilación. – mtbkrdave

Cuestiones relacionadas