Połączenie sygnału z funkcją

0

Mam taki oto kod maina:

QApplication a(argc, argv);
    QMainWindow window;
    window.setFixedSize(1000,750);
    window.setWindowTitle(QString::fromUtf8("Kolko i krzyzyk v2"));
    QMdiArea* area = new QMdiArea();
    area->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    QImage img(":/img/background.jpg");
    area->setBackground(QPixmap::fromImage(img));

    //Create QMdiSubWindow
        QMdiSubWindow* subWindow = new QMdiSubWindow();
        subWindow->setFixedSize(1000,750);
        QUiLoader uiLoader;
        QFile file(":/ui/menu.ui");
        QWidget *sortDialog = uiLoader.load(&file);
        if (sortDialog) {
            sortDialog->show();
        }

        QPushButton *nowa_gra =  sortDialog->findChild<QPushButton *>("nowa_gra");
        QPushButton *opcje =  sortDialog->findChild<QPushButton *>("opcje");
        QPushButton *o_autorze =  sortDialog->findChild<QPushButton *>("o_autorze");
        QPushButton *wyjscie =  sortDialog->findChild<QPushButton *>("wyjscie");

        QObject::connect(nowa_gra, SIGNAL(clicked()),&a, SLOT()); //TUTAJ JEST BŁĄD
        QObject::connect(wyjscie, SIGNAL(clicked()),&a, SLOT(quit()));

        subWindow->setWidget(sortDialog);
        subWindow->setStyleSheet("background: transparent;");

        //Add subWindow to Main QMdiWindow here
        area->addSubWindow( subWindow , Qt::FramelessWindowHint );

    window.setCentralWidget(area);
    window.show();

    return a.exec();

I mam pytanie jak teraz połączyć akcje kliknięcia przycisku nowa_gra z jakąś funkcją. Np. żeby wyświetliła QMessageBoxa po kliknięciu. Próbowałem już mnóstwo kombinacji, ale albo kompiler wypluwał błędy, albo po prostu nie działało :/

0

Opcja szukaj. Niedawno bylo identycznie pytanie i pokazywalem jak uzywac systemu sygnalow i slotow w Qt.

0

Musisz utworzyć slot i go wpisać w connect'cie

0

Tak, stworzyłem slot. Zrobiłem wszystko wg tego tematu http://4programmers.net/Forum/Newbie/206325-qt_-_definiowanie_wlasnych_gniazd ale nadal nie działa. Może mieć to związek z tym, że kod znajduje się w mainie a definicja slotu w plikach klasa.h i klasa.cpp? Próbowałem wywoływać slot przez nowa_gra() albo klasa::nowa_gra() i za każdym razem program odpalił się, ale nie było efektu.

0

Po kiego grzyba stosujesz QUiLoader? Nie prościej było, stworzyć normalnie okienko, z własnym kodem w C++?
Nawet jeśli potrzebna ci możliwość ręcznego modyfikowania UI już po zbudowaniu aplikacji jaką oferuje QUiLoader, to obecnie znacznie lepiej i wygodniej stosować QML-a.
Gdzie masz w ogóle obiekt odpowiedzialny za logikę twojej gry? To z tym obiektem się powinieneś połączyć (to sugeruje nazwa tego buttona)!

A jeśli chcesz tego message boxa to brakuje ci czegoś takiego:

QMessageBox msgBox;
msgBox.setText("Nowa gra nie jest jeszcze zrobiona");
QObject::connect(nowa_gra, SIGNAL(clicked()),&msgBox, SLOT(exec()));
0

Po pierwsze w obiektówce to mój pierwszy program więc powoli :D
QUiLoader stosuje po to żeby nie wyłączać okna przy przejściach między nimi. Wszystko jest w jednym oknie, a w wielu plikach *.ui.
QMLa niestety nie potrafię :)
http://szablony.freeware.info.pl/skrypty.html
A resztę wprowadzę w życie jutro, bo dziś piątek i nie będę miał czasu :P

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