Как выстравивать логику приложения в QTCreator?
Добрый день, разбираюсь с QT и хочу написать маленькую приложуху и просто уперся в один вопрос: как переключаться между виджетами, как выстраивать архитектуру приложения? Самое понятное для меня, что смог найти в книгах и интернетах это такой вариант: создаем главный виджет, в котором будем переключать существующие mainwid.cpp, потом я создал два пробных виджетам, между которыми хочу переключаться first.cpp и second.cpp. В главной функции создаю экземпляр главного виджета, первого и второго; добавляю первый и второй виджет внутрь стэка виджетов и записываю в переменные номера в стеках каждого и по наступлению события переключаемся между ними. Вопросы: на сколько такая логика имеет место быть? Как обращаться к mainwid, стоит ли создать какой-то слот или что-то еще, я не очень понимаю что нужно прописывать в команде connect третий и четвертый параметры, точнее как обращаться к тому, что должно стоять на месте третьего параметра?
P.S. я даже не могу проверить то, что написал ибо сначала мне компилятор говорил, что all: no such file or directory и останавливался на компиляции файла first.o, а после добавления к проекту файлов second.h и second.cpp выдает ошибку в 13 строке файла main.cpp что он якобы не знает тип second, но все же подключено по аналогии с first, а там нет ошибок, я подавлен....
P.P.S. очень сильно надеюсь на вашу помощь, а то уже совсем всё плывет(((
код:
*.pro
- SOURCES += \
- main.cpp \
- mainwid.cpp \
- first.cpp \
- second.cpp
- QT += widgets \
- gui
- HEADERS += \
- mainwid.h \
- first.h \
- second.h
first.h
- #ifndef FIRST_H
- #define FIRST_H
- #include<QApplication>
- #include<QtWidgets>
- class first : public QWidget
- {
- Q_OBJECT
- public:
- first();
- private:
- QPushButton *Button1;
- QLabel *label1;
- QLabel *label2;
- };
- #endif // FIRST_H
second.h
- #ifndef FIRST_H
- #define FIRST_H
- #include<QApplication>
- #include<QtWidgets>
- class second : public QWidget
- {
- Q_OBJECT
- public:
- second();
- private:
- QPushButton *Button1;
- QLabel *label1;
- QLabel *label2;
- };
- #endif // FIRST_H
mainwid.h
- #ifndef MAINWID_H
- #define MAINWID_H
- #include<QApplication>
- #include<QtWidgets>
- #include<QStackedWidget>
- #include"first.h"
- class mainwid : public QWidget
- {
- Q_OBJECT
- public:
- mainwid(QWidget* parent = 0);
- QStackedWidget *QSW;
- private:
- };
- #endif // MAINWID_H
first.cpp
- #include"first.h"
- first::first():QWidget()
- {
- Button1 = new QPushButton("Back", this);
- label1 = new QLabel("1st window", this);
- label2 = new QLabel("still window 1", this);
- connect(Button1, SIGNAL(clicked()), this, SLOT(setCurrentWindow(int)));
- }
main.cpp
- #include <QApplication>
- #include "mainwid.h"
- #include "first.h"
- #include "second.h"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- mainwid *Widget = new mainwid();
- first *First = new first();
- second *Second = new second();
- int a = Widget->QSW->addWidget(First);
- int b = Widget->QSW->addWidget(Second);
- Widget->QSW->setCurrentIndex(a);
- Widget->show();
- return app.exec();
- }
mainwid.cpp
- #include"mainwid.h"
- mainwid::mainwid(QWidget *parent) : QWidget(parent)
- {
- QSW = new QStackedWidget(this);
- }
second.cpp
- #include"second.h"
- second::second():QWidget()
- {
- Button1 = new QPushButton("Back", this);
- label1 = new QLabel("2nd window", this);
- label2 = new QLabel("again 2nd window", this);
- connect(Button1, SIGNAL(clicked()), this, SLOT(setCurrentWindow(int)));
- }
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- МА1 апреля 2025 г. 16:210ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день. Советую для начала изучить статьи и разобраться с сигналами и слотами. Это одна из важнейших составляющих программирования с использованием Qt. На данном сайте все изложено довольно понятно и с примерами.
По поводу вопроса о том, что не видно second: у вас в обоих заголовочных файлах
это защита и она сработала ))
да, спасибо) это помогло и вернуло к старой проблеме:
даже проект новый пересобрал, всё равно не понимаю чего ему не хватает с этим файлом.
Ну и если абстрагироваться в вопросе про сигналы и слоты, то логика построения приложения сильно неправильная?
Добрый день!
Помогло... а что именно вы сделали?
И новый проект пересобрали... но это не значит, что снова был выполнен шаг qmake , лучше просто удалить полностью build каталог.
Приложение слишком маленькое, чтобы говорить о какой-то архитектуре.
Косяков в общем-то хватает, начиная от использования устаревшего синтаксиса сигналов и слотов и заканчивая просто вырвиглазным код-стайлом, который в продакшене не используется. Что именно хотите услышать?
Я имел в виду, что это надо было исправить:
qmake всегда запускаю первым делом. Ну, почти всегда.
Услышать хотел бы как написать приложение, на основе которого можно было бы уже делать что-то большее. Суть в том, что есть у нас две формы и перерисовывать их, сменяя одну другой, в том же окне, а не создавать новое для каждой, здесь я откровенно не могу разобраться.
Это нужно было переписать на
Ок. Тогда к вопросу о приложении. Если хотите относительно комфортно вести разработку, то я бы рекомендовал всё-таки использовать Qt Designer и накидывать формы в дизайнере, а то если честно, очень потом тяжело разгребать нагромождение только одних формирований формочек, которые могу достигать нескольких тысяч строк кода. Использование дизайнера на самом деле удобная вещь.
Что касается приложения, то если у вас есть приложение с одним главным окном, то добавлять все виджеты и прочее лучше уже внутри конструктора или методов данного окна приложения, а не так, как у вас сделано в main функции.
Если у вас в главном окне приложения будут дополнительные диалоги, то можно использовать пул диалогов, если предполагается кеширование, если вам нужно менять виджеты без их пересоздания, а просто переключать, то можете использовать QStackedWidget или QTabView.
А так, ну, делаете главное окно приложения, диалоги разработываете в отдельно, по возможности с минимальной связью с главным окном, чтобы можно было просто аргументы какие-то передавать им для инициализации и т.д. Тоже самое со сложными виджетами. Но не увлекайтесь преждевременными оптимизациями, если не требуется сложный виджет, или виджет, который будет повторяться в других местах, то его можно накидать прямо в форме главного окна приложения.
P/S/ и всё-таки откажитесь от записи сигналов и слотов на макросах. Это себя уже отжило, да и порой создаёт больше проблем, чем новый синтаксис на указателях.
Спасибо, буду разбираться