Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
ТЗ
21 декабря 2018 г. 0:29

Как выстравивать логику приложения в QTCreator?

Qt

Добрый день, разбираюсь с 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)));
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
6

Добрый день. Советую для начала изучить статьи и разобраться с сигналами и слотами. Это одна из важнейших составляющих программирования с использованием Qt. На данном сайте все изложено довольно понятно и с примерами. По поводу вопроса о том, что не видно second: у вас в обоих заголовочных файлах

#ifndef FIRST_H
#define FIRST_H
...

это защита и она сработала ))

0
ТЗ

да, спасибо) это помогло и вернуло к старой проблеме:

gcc   first.o all   -o first
gcc: error: all: No such file or directory
<builtin>: recipe for target 'first' failed
make: *** [first] Error 1
17:54:17: Процесс «/usr/bin/make» завершился с кодом 2.
Ошибка при сборке/установке проекта todoList1 (комплект: Desktop Qt 5.12.0 GCC 64bit)
Во время выполнения этапа «Сборка»

даже проект новый пересобрал, всё равно не понимаю чего ему не хватает с этим файлом. Ну и если абстрагироваться в вопросе про сигналы и слоты, то логика построения приложения сильно неправильная?

0

Добрый день!

Помогло... а что именно вы сделали?

И новый проект пересобрали... но это не значит, что снова был выполнен шаг qmake , лучше просто удалить полностью build каталог.

Приложение слишком маленькое, чтобы говорить о какой-то архитектуре.
Косяков в общем-то хватает, начиная от использования устаревшего синтаксиса сигналов и слотов и заканчивая просто вырвиглазным код-стайлом, который в продакшене не используется. Что именно хотите услышать?

0
ТЗ

Я имел в виду, что это надо было исправить:

#ifndef FIRST_H
#define FIRST_H

qmake всегда запускаю первым делом. Ну, почти всегда. Услышать хотел бы как написать приложение, на основе которого можно было бы уже делать что-то большее. Суть в том, что есть у нас две формы и перерисовывать их, сменяя одну другой, в том же окне, а не создавать новое для каждой, здесь я откровенно не могу разобраться.

0

Это нужно было переписать на

#ifndef SECOND_H
#define SECOND_H

Ок. Тогда к вопросу о приложении. Если хотите относительно комфортно вести разработку, то я бы рекомендовал всё-таки использовать Qt Designer и накидывать формы в дизайнере, а то если честно, очень потом тяжело разгребать нагромождение только одних формирований формочек, которые могу достигать нескольких тысяч строк кода. Использование дизайнера на самом деле удобная вещь.

Что касается приложения, то если у вас есть приложение с одним главным окном, то добавлять все виджеты и прочее лучше уже внутри конструктора или методов данного окна приложения, а не так, как у вас сделано в main функции.

Если у вас в главном окне приложения будут дополнительные диалоги, то можно использовать пул диалогов, если предполагается кеширование, если вам нужно менять виджеты без их пересоздания, а просто переключать, то можете использовать QStackedWidget или QTabView.

А так, ну, делаете главное окно приложения, диалоги разработываете в отдельно, по возможности с минимальной связью с главным окном, чтобы можно было просто аргументы какие-то передавать им для инициализации и т.д. Тоже самое со сложными виджетами. Но не увлекайтесь преждевременными оптимизациями, если не требуется сложный виджет, или виджет, который будет повторяться в других местах, то его можно накидать прямо в форме главного окна приложения.

P/S/ и всё-таки откажитесь от записи сигналов и слотов на макросах. Это себя уже отжило, да и порой создаёт больше проблем, чем новый синтаксис на указателях.

0
ТЗ

Спасибо, буду разбираться

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
IT
25 марта 2019 г. 17:32
Ilya The Engineer

Qt - Тест 001. Сигналы и слоты

  • Результат:5баллов,
  • Очки рейтинга-10
G
25 марта 2019 г. 8:34
GAG

C++ - Тест 002. Константы

  • Результат:41баллов,
  • Очки рейтинга-8
G
25 марта 2019 г. 8:25
GAG

C++ - Тест 001. Первая программа и типы данных

  • Результат:66баллов,
  • Очки рейтинга-1
Последние комментарии
22 марта 2019 г. 12:32
Евгений Легоцкой

Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.
ВН
22 марта 2019 г. 11:08
Волчонок Над-Пропастью

Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг ...
21 марта 2019 г. 15:49
Евгений Легоцкой

серьезно? Эта ошибка 404 уже даже не относится к данному вопросу. В каких-то urls в вашем проекте. Вопросы, которые не относятся непосредственно к статье, задавайте, пожалуйста на...
АБ
21 марта 2019 г. 15:00
Артем Бел

а это где? сейчас ошибка в debag такая: Page not found (404)Request Method: GETRequest URL: http://amadowshop.site/accounts/profile/
21 марта 2019 г. 12:47
Евгений Легоцкой

не вижу здесь проблемы, поменяйте url для callback в приложения oauth в социальных сетях https://amadowshop.site/auth/verify/complete/facebook/
Сейчас обсуждают на форуме
U
25 марта 2019 г. 12:43
Unreal_man

Как сделать чтоб при клике на ячейку(ос андроид) ее сразу можно было редактировать?QGuiApplication::inputMethod()->show(); показывает клавиатуру, а вот что до этого прописать чтоб текст в ...
m
24 марта 2019 г. 10:36
monevich

Отвечу на свой же вопрос, может кому то это пригодится. Да, можно в функции main использовать такую конструкцию. При запуске программы из Qt передаю свой аргумент в параметрах командной строк...
22 марта 2019 г. 12:29
Дмитрий

Да, мьютекс добавил, но в том потоке, где сигнал вызывается.
ВН
22 марта 2019 г. 9:04
Волчонок Над-Пропастью

Да, на эту проблему! Зато у меня теперь новая, ругается на подключение QMediaPlayer, пишет, что не находит подобного файла или библиотеки. Пока не нашла как исправить, только вариант с переуст...
22 марта 2019 г. 8:58
Михаиллл

4) это , похоже, для создания видоизмененных страниц, для анимации. 3,5) добавить фвйл/qt/ui.qml
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы