Russian Qt Forum
Октябрь 02, 2024, 11:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStackedWidget замена Widgeta при нажатии на кнопку  (Прочитано 6693 раз)
Ales
Гость
« : Февраль 04, 2014, 00:51 »

Пытаюсь, сделать так, чтобы при нажатии на кнопку изменялось содержимое окна, делаю через QStackWidget

пишет ошибку : QObject::connect: No such slot QWidget::clickRules () , не понимаю в чём дело

вот код:
Код:
#include "mainwindow.h"
#include <QApplication>
#include <QtGui>
#include <QStackedWidget>
#include <QPushButton>
#include <QWidget>
#include <QGroupBox>
#include <QLayout>
#include <QObject>
#include <QtDebug>

class MainWidget : public QWidget {
    public :
        QPushButton* buttonRules;
        MainWidget( );
};

class RulesWidget : public QWidget {
    public:
        QPushButton* mainButton;
        RulesWidget();
};

MainWidget :: MainWidget () {
    buttonRules = new QPushButton("Rules");
    QVBoxLayout* buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(buttonRules);
    setLayout(buttonLayout);
}

RulesWidget :: RulesWidget () {
    mainButton = new QPushButton("Main");
    QVBoxLayout* buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(mainButton);
    setLayout(buttonLayout);
}


class TheMainestWidget : public QWidget {
    private:

    public:
        MainWidget* menu;
        RulesWidget* rules;
        QStackedWidget* stackOfWidgets;
        TheMainestWidget ();
    public slots:
        void clickMenu (QStackedWidget*);
        void clickRules ();
};

TheMainestWidget :: TheMainestWidget () {
    menu = new MainWidget;
    rules = new RulesWidget;

    stackOfWidgets = new QStackedWidget;
    stackOfWidgets->addWidget(menu);
    stackOfWidgets->addWidget(rules);
    stackOfWidgets->setCurrentWidget(menu);
   // stackOfWidgets->show();

    connect(rules->mainButton, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(menu->buttonRules, SIGNAL(clicked()), SLOT(clickRules () ));
    stackOfWidgets->show();
}

void TheMainestWidget :: clickMenu(QStackedWidget* stackOfWidgets) {
    stackOfWidgets->setCurrentWidget(menu);
    stackOfWidgets->show();
}

void TheMainestWidget :: clickRules() {
    stackOfWidgets->setCurrentWidget(rules);
    stackOfWidgets->show();
}


int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
 //   MainWindow w;
 //   w.show();

    TheMainestWidget game;


    return a.exec();
}


да, я знаю код плохой, плохие названия, все данные public,))  должно быть, что при нажатии на кнопку, появляется другая кнопка в окне, вместо этой, и при нажатии на появившуюся кнопку виджета закрывается.
Буду благодарен за помощь)
« Последнее редактирование: Февраль 05, 2014, 11:36 от Ales » Записан
Bepec
Гость
« Ответ #1 : Февраль 04, 2014, 17:57 »

По пунктам.
1) используйте тег Code для кода - значок вот такой на панельке "#".
2) ЧТО ЭТО?
Код:
TheMainestWidget :: TheMainestWidget (QApplication &a)
и зачем?
3) макроса Q_OBJECT нету в объявлении класса со слотами.
4) разделяйте классы. Разделяйте Cpp и h.

оффтоп: у вас глаза не выпучиваются когда в эти макароны смотрите? у меня вылезли Веселый

PS посмотрел просто потому что хорошее настроение было. А так бы и не сунулся, извиняйте Улыбающийся
Записан
Ales
Гость
« Ответ #2 : Февраль 04, 2014, 21:43 »

Спасибо,)
1) исправил, не знал как такое делать))
2) я предаю в конструктор
Код:
 QApplication &a 
, чтобы при нажатии на кнопку можно было выйти из программы, может можно как-то по другому, но у меня не получалось)
3) почему-то когда я объявляю этот макрос, то выскакивает такая ошибка : LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const *, ну и такая ошибка не одна
4) да я знаю, что нужно разделять, но тут хотел быстрее сделать, решил всё в одном файле писать, получилось наоборот)

Ещё раз спасибо за информацию  Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Февраль 05, 2014, 01:02 »

2) Уберите у конструктора передачу ссылки на экземпляр QApplication - он не нужен, потому что есть статичные методы + можно использовать макрос qApp, для получения указателя на QApplication Улыбающийся

Код
C++ (Qt)
connect( rules->mainButton, SIGNAL(clicked()), qApp , SLOT(quit())) ;

PS. так как ваш класс является наследников QObject, то использовать QObject:: не нужно!

3) Очистите проект (на всякий случай), после запустите qmake Улыбающийся
Просто, классы с макросом Q_OBJECT должны были пройти через метакомпилятор qt (вызов qmake), но этого не случилось Улыбающийся
« Последнее редактирование: Февраль 05, 2014, 01:09 от gil9red » Записан

Ales
Гость
« Ответ #4 : Февраль 05, 2014, 11:57 »

Спасибо, Улыбающийся
2) Ага, с этим разобрался, всё исправил )) мне тоже не нравилась эта передача параметра по ссылке.
3) А вот тут всё сложнее, что-то у меня не получается всё равно В замешательстве  как я понял запустить qmake можно нажатий правой кнопки на проект, потом qmake ), но всё равно у меня те же самые ошибки, может я делаю что-то неправильно или не в той последовательности, ведь как сначала добавляем макрос Q_OBJECT, потом запускаем qmake?
P.S. Ещё раз благодарю за помощь Улыбающийся
Записан
Bepec
Гость
« Ответ #5 : Февраль 05, 2014, 12:31 »

Я обычно советую удалить креатор и поставить студию Веселый

Но по слухам помогает clean проекта (или удалить нафиг все сгенерированные файлы) и заного собрать.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Февраль 05, 2014, 15:51 »

Я обычно советую удалить креатор и поставить студию Веселый
Креатор хороший, не нужно его обижать Улыбающийся

Ales, правой кнопкой и выберите Очистить проект, а потом выберите qmake
Или вручную удалите папку build (или как она у вас там называется) после делайте сборку Улыбающийся
Должно помочь Подмигивающий
Записан

Ales
Гость
« Ответ #7 : Февраль 06, 2014, 22:38 »

Эх, что я не пытался сделать ничего не помогло, и очищал после запускал qmake, и удалял папку build потом делал тоже самое)
ничего не помогло : пишет эти ошибки : LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const *,
что делать не знаю) в чём же тут дело?
Записан
Bepec
Гость
« Ответ #8 : Февраль 06, 2014, 23:32 »

макроса Q_OBJECT может находиться только в классе, наследованном от QObject.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Февраль 07, 2014, 00:17 »

Автор темы еще может сбросить сюда проект, так будет проще (возможно) найти ошибку и решение Улыбающийся
Записан

Bepec
Гость
« Ответ #10 : Февраль 07, 2014, 00:44 »

А я думаю, что как обычно, читают первые 3 строки, читают следующий коммент Веселый
Записан
Ales
Гость
« Ответ #11 : Февраль 07, 2014, 14:27 »

Как просили скидываю проект)
Вот архив проекта; как я понимаю, то остальные файлы роли сильной не играют.  Улыбающийся

Ну и с наследованием наверное всё правильно, мои классы наследуются от QWidget, а  QWidget это же наследник QObject, значит и мои объекты наследуются от QObject.
P.S Спасибо всем за помощь в этом запутанном деле Улыбающийся Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Февраль 07, 2014, 22:13 »

Для каждого класса нужно создавать h и cpp файлы Подмигивающий
Вот проверьте Улыбающийся
Записан

Ales
Гость
« Ответ #13 : Февраль 13, 2014, 02:45 »

Очень благодарен, только сейчас смог посмотреть хотя вы уже ответили давно Улыбающийся
Спасибо большое,  Улыбающийся всё работает как надо  Улыбающийся
вы не подключаете так много библиотек как подключал я; так гораздо лучше, код с разбиением на файлы стал чище и понятнее),
Хотя всё равно не понятно почему не работал мой последний вариант.
Ещё раз спасибо за помощь Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Февраль 13, 2014, 08:06 »

Пожалуйста Подмигивающий
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.