© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
1 августа 2018 г. 8:05

Помогите со слоями

Хочу написать прогу учёт финансов. Для начала надо решить такую задачу: задумано 3 слоя, условно "главное меню", "меню доходов", "меню расходов". В каждом меню есть кнопки, посредством нажатия которых юзер должен переходить от слоя к слою(от меню к меню). Что и где исправить чтоб при нажатии кнопки главного меню скажем "Расходы", текущий слой скрылся, а слой меню "Расходы" с кнопками показался?

П.С. Код переделывал и так и этак, так и не скомпилился, поэтому может быть лишак то тут, то там.

Не нашёл как прикрепить несколько файлов

И еще

Добрый день.

Пожалуйста, не прикрепляйте программный код в виде картинок, а используйте для вставки программного кода специальный диалог... в редакторе это кнопка со значком "<>".
Тогда там будет выбрана подсветка синтаксиса кода. Никто не будет перепечатывать весь ваш код у себя, если захочет проверить, где ошибка со сборкой.

Для Django рекомендую VDS-хостинг TIMEWEB

Здравствуйте, Евгений. Я конечно всё понимаю, но Вы уж помогите по материалам которые доступны. Код - изи. Думаю и на глаз будет понятно что к чему, но на будущее усвоил. Больше так делать не буду.


А что касается самого кода,
то думаю, что ошибка в том, что у вас слоты написаны так, что там происходит копирование, вместо взятия по ссылке...
Объявление должно быть следующим, соответственно и реализацию исправить нужно.
void MainToD (QMainWindow&, QVBoxLayout*);
Ну и плюсом сам коннект слота... Параметры передавать нельзя в СЛОТ, компилироваться не будет. Это подключение сигнала к слоту. Можно разрешить через лямбду в принципе.
QObject::connect(pb1, &QApplication::clicked, [&window, DL]()
{
    window.MainToD(window, DL);
});
Также слоты исправить так
void MainWindow::MainToD(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(bl);
    a.show();
}
Также, подтяните знания по С++ , ошибки совсем дилетантские, и к Qt никак не относятся.
Также, рекомендую почитать про сигналы и слоты

Для Django рекомендую VDS-хостинг TIMEWEB

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    void MainToD(QMainWindow&, QVBoxLayout*);
    void MainToR(QMainWindow&, QVBoxLayout*);
    void ToMain(QMainWindow&, QVBoxLayout*);
};

#endif // MAINWINDOW_H

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
class QMainWindow;
class QVBoxLayout;

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

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

void MainToD(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(&bl);
    a.show();
}

void MainToR(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(&bl);
    a.show();
}

void ToMain(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(&bl);
    a.show();
}

main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QVBoxLayout>
#include <QMainWindow>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton * pb1 = new QPushButton("Доходы");
    pb1->show();
    QPushButton * pb2 = new QPushButton("Расходы");
    pb2->show();
    QPushButton * pb3 = new QPushButton("Выход");
    pb3->show();
    QPushButton * pb4 = new QPushButton("Просмотреть доходы");
    pb4->show();
    QPushButton * pb5 = new QPushButton("Записать доходы");
    pb5->show();
    QPushButton * pb6 = new QPushButton("Назад");
    pb6->show();
    QPushButton * pb7 = new QPushButton("Выход");
    pb7->show();
    QPushButton * pb8 = new QPushButton("Просмотреть расходы");
    pb8->show();
    QPushButton * pb9 = new QPushButton("Записать расходы");
    pb9->show();
    QPushButton * pb10 = new QPushButton("Назад");
    pb10->show();
    QPushButton * pb11 = new QPushButton("Выход");
    pb11->show();

    QVBoxLayout * MainL = new QVBoxLayout;
    MainL->addWidget(pb1);
    MainL->addWidget(pb2);
    MainL->addWidget(pb3);
    QVBoxLayout * DL = new QVBoxLayout;
    DL->addWidget(pb4);
    DL->addWidget(pb5);
    DL->addWidget(pb6);
    DL->addWidget(pb7);
    QVBoxLayout * RL = new QVBoxLayout;
    RL->addWidget(pb8);
    RL->addWidget(pb9);
    RL->addWidget(pb10);
    RL->addWidget(pb11);

    MainWindow window;
    window.setLayout(MainL);
    window.show();

    QObject::connect(pb1, &QPushButton::clicked, [&window, DL]()
    {
        window.MainToD(window, DL);
    });
    QObject::connect(pb3, SIGNAL(clicked()), &app, SLOT(quit()));

    return app.exec();
}

Сделал как порекомендовали

Не могу фотки ошибок прикрепить

Не совсем полностью, как порекомендовал.... плюс там ещё ошибки есть, с картинки неудобно ревировать код.


main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>

#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton * pb1 = new QPushButton("Доходы");
    pb1->show();
    QPushButton * pb2 = new QPushButton("Расходы");
    pb2->show();
    QPushButton * pb3 = new QPushButton("Выход");
    pb3->show();
    QPushButton * pb4 = new QPushButton("Просмотреть доходы");
    pb4->show();
    QPushButton * pb5 = new QPushButton("Записать доходы");
    pb5->show();
    QPushButton * pb6 = new QPushButton("Назад");
    pb6->show();
    QPushButton * pb7 = new QPushButton("Выход");
    pb7->show();
    QPushButton * pb8 = new QPushButton("Просмотреть расходы");
    pb8->show();
    QPushButton * pb9 = new QPushButton("Записать расходы");
    pb9->show();
    QPushButton * pb10 = new QPushButton("Назад");
    pb10->show();
    QPushButton * pb11 = new QPushButton("Выход");
    pb11->show();

    QVBoxLayout * MainL = new QVBoxLayout;
    MainL->addWidget(pb1);
    MainL->addWidget(pb2);
    MainL->addWidget(pb3);
    QVBoxLayout * DL = new QVBoxLayout;
    DL->addWidget(pb4);
    DL->addWidget(pb5);
    DL->addWidget(pb6);
    DL->addWidget(pb7);
    QVBoxLayout * RL = new QVBoxLayout;
    RL->addWidget(pb8);
    RL->addWidget(pb9);
    RL->addWidget(pb10);
    RL->addWidget(pb11);

    MainWindow window;
    window.setLayout(MainL);
    window.show();

    QObject::connect(pb1, &QPushButton::clicked, [&window, DL]()
    {
        window.MainToD(window, DL);
    });
    QObject::connect(pb3, SIGNAL(clicked()), &app, SLOT(quit()));

    return app.exec();
}

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QVBoxLayout;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void MainToD(QMainWindow&, QVBoxLayout*);
    void MainToR(QMainWindow&, QVBoxLayout*);
    void ToMain(QMainWindow&, QVBoxLayout*);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

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

#include <QVBoxLayout>

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

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

void MainWindow::MainToD(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(bl);
    a.show();
}

void MainWindow::MainToR(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(bl);
    a.show();
}

void MainWindow::ToMain(QMainWindow& a, QVBoxLayout* bl)
{
    a.hide();
    a.setLayout(bl);
    a.show();
}

Для Django рекомендую VDS-хостинг TIMEWEB

Максимальный размер прикрепляемого файла - 1 мегабайт

Для Django рекомендую VDS-хостинг TIMEWEB

Спасибо, Евгений, собралось. Однако вид у приложения следующий: открывается белый экран и при каждом нажатии кнопки "назад"(собирал под ведро)  на весь экран появляются кнопки pb11, pb10,..pb1и при ещё одном нажатии Назад приложение закрывается. Срабатывает только pb1(открывается пустое окно как в начале) и при нажатии Назад возвращает на кнопку pb1, ну и pb3 закрывает приложение(больше я не делал кнопки). Что я сконструировал не так?

  1. Под Андроид лучше разработку вести на QML, чем на классических виджетах
  2. Кнопки и слои как минимум должны быть скрыты в вашем случае. Соберите под Десктоп и увидите ещё более печальную картинку. Также у кнопок должен быть parent (то есть MainWindow), иначе они будут висеть отдельными окнами
  3. Насчёт того, что сконструировали не так. У вас просто недостаточно опыта, чтобы сразу правильно спроектировать, а рассказывать слишком много, делайте всё поступательно, а не наскоком. И смотрите как сделано в статьях, вот здесь достаточно примеров для самых разных случаев: Qt разработка

Под Андроид рекомендую также посмотреть вот эти разделы:

Для Django рекомендую VDS-хостинг TIMEWEB

Проверочное сообщение

Для Django рекомендую VDS-хостинг TIMEWEB

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 октября 2018 г. 21:36
Allyans .

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

  • Результат 60баллов,
  • Очки рейтинга-1
15 октября 2018 г. 11:25
Екатерина Самойлова

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

  • Результат 33баллов,
  • Очки рейтинга-10
15 октября 2018 г. 11:17
Екатерина Самойлова

C++ - Тест 006. Перечисления

  • Результат 80баллов,
  • Очки рейтинга4
Последние комментарии
10 октября 2018 г. 9:50
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Если и начинать писать о плагинах, то нужно тогда с Qt Creator начинать, там наверняка будет одинаковый принцип, но по Qt Creator хотя бы информация есть.
10 октября 2018 г. 9:48
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

О плагинах к QtCreator в целом, тоже интересно.
10 октября 2018 г. 9:46
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

ну типа того, создание программы, функционал которой можно расширять плагинами, и, в перспективе, создание API.
10 октября 2018 г. 8:31
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Типо как в Qt Creator? Самому бы интересно было о таком почитать. В данный момент я бы мог написать только о написании плагинов для Qt Designer. С этим есть некоторый опыт.
Сейчас обсуждают на форуме
15 октября 2018 г. 12:45
Allyans .

QGraphicsItem change color

Хорошо)
11 октября 2018 г. 10:13
Arrow

Работа с WebView в QML

Нашел в чем проблема. Пишу на случай если кому-то попадется такое же счастье с WebView как и мне. Проблема как оказалась с Debug версией, так как в Release и Profile все работает (...
10 октября 2018 г. 12:49
Виталий Антипов

Кто что делает на Qt?

Работаем по локальной сети. Файл базы, схемы и фото лежат на сервере. Чтобы не было проблем при одновременной работе с одним файлом, все запросы обернул в транзакции, как указано в документаци...
10 октября 2018 г. 11:21
Arrow

Редактирование записи на форуме

Добрый день! К сожалению встретил небольшой баг на форуме. При создании записи на форуме и вставке кода, через соответствующую кнопку номера строк проставляются верно, но каждый...
10 октября 2018 г. 9:46
Arrow

Настройка Qt Creator для Android

Я Genymotion  ставил с VBox в комплекте для личного использования, после добавил из списка телефон с нужным API. Запустил его и при компиляции Qt Creator сам нашел его и все запустилось...
Присоединяйтесь к нам в социальных сетях