Qt - czym różni się Ui::MainWindow* od this gdzie this to pointer na MainWindow?

0

Zaczynam naukę Qt i zastanawiam się na czym polega różnica między Ui::MainWindow * i MainWindow *.

Korzystam z Qt Creatora, który generuje taki kod:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

/* Kod dodany przeze mnie */
private slots:
    void NumPressed();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   /* Kod dodany przeze mnie. 
       sender to pointer na przykładowy obiekt, nie tworzyłem go nigdzie, żeby nie zaśmiecać Wam kodu. */
    connect(&sender, SIGNAL(released()), ui, SLOT(NumPressed());
}

MainWindow::~MainWindow()
{
    delete ui;
}

Błąd występuje podczas wywołania funkcji connect. Brzmi on tak: candidate function template not viable: no known conversion from 'Ui::MainWindow *' to 'const QObject *' for 3rd argument. Prawidłowe wywołanie funkcji connect:

connect(&sender, SIGNAL(released()), this, SLOT(NumPressed());

Różnica jest w tym, że zmieniłem ui na this, ale nie wiem dlaczego ui jest tutaj błędnym argumentem. Przecież this to pointer na instancję klasy MainWindow ten konstruktor:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
}

Do ui przypisuje pointer na instancję klasy MainWindow z tego co rozumiem. Dlaczego więc ui != this? Byłby mi ktoś w stanie to wyjaśnić? :)

2

Klasa UI to klasa-kontener (zwykła struktura, niedziedzicząca po niczym) implementująca to co sobie wyklikasz w pliku .ui w Qt Designerze. Klasa MainWindow (czy jak ją sobie nazwiesz) to dziedzicząca (możliwie pośrednio) po QWidget klasa implementująca widget. W niej implementujesz bardziej zaawansowaną logikę okna.

   /* Kod dodany przeze mnie. 
       sender to pointer na przykładowy obiekt, nie tworzyłem go nigdzie, żeby nie zaśmiecać Wam kodu. */

Takie przykłady nie mają sensu. Zawsze się prosi o MCVE właśnie po to, aby było można rozmawiać o konkretnym przypadku.

Błąd występuje podczas wywołania funkcji connect. Brzmi on tak: candidate function template not viable: no known conversion from 'Ui::MainWindow *' to 'const QObject *' for 3rd argument. Prawidłowe wywołanie funkcji connect:

connect(&sender, SIGNAL(released()), this, SLOT(NumPressed());

To nie jest poprawne wywołanie connect:

  • nie wiadomo czym jest sender
  • slot NumPressed nie ma implementacji
  • używasz składni connect z Qt4 i starszych. Używaj nowej składni (ze wskaźnikami na funkcje).

Jeśli dobrze rozumiem, to dla Ciebie myląca jest tutaj nomenklatura. MainWindow i Ui::MainWindow to dwie zupełnie różne klasy. Równie dobrze mogą się nazywać Heniek i Zenek. ui to instancja kontenera na rzeczy wygenerowane z pliku xml/ui, a this w kontekście MainWindow to instancja QWidget odpowiedzialna za obsługę tego widgetu.

Zerknij sobie w wygenerowany kod (F2 na nazwie typu, albo nagłówku) to zobaczysz czym ta klasa jest.

0

Rozumiem. Ui::MainWindow i MainWindow to rzeczywiście dwie różne klasy i po to został dodany namespace. :) Przepraszam, że nie pokazałem reszty kodu w takim razie, na przyszłość będę wiedział, żeby to robić. Dziękuję za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1