Dostęp do widżetu z drugiej klasy w Qt

0

Witam.
Tak, jak w temacie.
Mam dwie klasy. Jedna to MainWindow, a druga to zwykła klasa c++. MainWindow to klasa wygenerowana przez Qt Creator, która wygląda tak:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "jakasklasa.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

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

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

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

I teraz chciałbym, aby druga klasa("JakasKlasa") miała dostęp do tej pierwszej. Tzn. żebym mógł w niej operować na elementach GUI znajdujących się w MainWindow.
W zwykłej klasie raczej nie miałbym takich problemów, lecz niestety tutaj coś mi to nie idzie.

Z góry dziękuje za pomoc.

0

Użyj sygnałów i slotów w celu wymiany informacji między oknami.

0

Ale druga klasa nie jest okienkiem, tylko zwykłą klasą.

0

Nadal możesz użyć sygnałów i slotów.
Możesz z poziomu MainWindow udostępnić publiczne metody które wywołasz sobie w JakasKlasa.

0

O dziwo nie mogę użyć metod z głównej klasy.
Pojawia się następujący komunikat:
C2352: 'MainWindow::Test' : illegal call of non-static member function

0

Czy z tego wynika, że muszę mieć funkcje static, lecz w takim razie w jaki sposób mam ją zadeklarować skoro widżety są częścią głównej klasy?

0

Podaj cały kod.

0

Sorry, że tak długo nie odpowiadałem, ale nie miałem dostępu do komputera i prawie że zapomniałem o tym temacie.
Kodu, o którym była mowa niestety już nigdzie nie mam zapisanego, ale napisałem na szybko inny, w którym również mam ten sam problem.
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDebug>
#include "jakasklasa.h"


class MainWindow
{
public:
   MainWindow();
    void test();
};

#endif // MAINWINDOW_H

.cpp

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

MainWindow::MainWindow()
{

}

void MainWindow::test()
{
    qDebug("asdasdasdasdasd");
}

jakasklasa.h

#ifndef JAKASKLASA_H
#define JAKASKLASA_H
#include "mainwindow.h"
class JakasKlasa
{
public:
    JakasKlasa();
};

#endif // JAKASKLASA_H

.cpp

#include "jakasklasa.h"

JakasKlasa::JakasKlasa()
{
    MainWindow::test(); // <----------------Problem
}

main

#include "mainwindow.h"

int main(int argc, char *argv[])
{
    MainWindow a;
    return 0;
}

I chciałbym aby metoda z klasy mainwindow została użyta w klasie JakasKlasa.

0

Zacznij od nauki podstaw języka w którym piszesz. Pisane z palca więc mogłem coś skopać.

class JakasKlasa
{
public:
    JakasKlasa(MainWindow *w);
};
JakasKlasa::JakasKlasa(MainWindow *w)
{
  w->test();
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow a;
    JakasKlasa foo(&a);
    return app.exec();
}
0

Niestety pojawia się następujący błąd:C2061: syntax error : identifier 'MainWindow'
przy linijce linijce JakasKlasa(MainWindow *w); w pliku JakasKlasa.h

0

Stawiam na brak średnika gdzieś. Ale mi się szklana kula rozbiła dzisiaj :(

0

Byłby inny komunikat w przypadku braku średnika.

0

To w takim razie dziękuje za pomoc...

0

Kod jest ten sam, tyle że z tymi poprawkami.
Czyli:

main

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow a;
    JakasKlasa foo(&a);
    return app.exec();
}

mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDebug>
#include "jakasklasa.h"


class MainWindow
{
public:
   MainWindow();
    void test();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow()
{

}

void MainWindow::test()
{
    qDebug("asdasdasdasdasd");
}

JakasKlasa

#ifndef JAKASKLASA_H
#define JAKASKLASA_H
#include "mainwindow.h"
class JakasKlasa
{
public:
    JakasKlasa(MainWindow *w);// <---------------- Tu pojawia sie problem

};

#endif // JAKASKLASA_H
#include "jakasklasa.h"

JakasKlasa::JakasKlasa(MainWindow *w)
{
    w->test(); 
0

dodaj:

class MainWindow;

przed:

class JakasKlasa
{
...

Lub dopilnuj aby najpierw była podłączona definicja MainWindow a potem definicja JakasKlasa.

0

Okey, ystarczyło zrobić coś takiego:

void JakasKlasa::inic(QTextBrowser *brow)
{
    browser = brow;
}
void JakasKlasa::Operacje()
{
// operacje na borwser
}

Nie wiem czemu przedtem na to nie wpadłem.
W moim programie ta druga klasa jest tablicą, więc ten sposób powyżej coś nie działał jak należy, ale tutaj jest już ok.
Dziękuje za pomoc.

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