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

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

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

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

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

И еще

Добрый день.

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

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


А что касается самого кода,
то думаю, что ошибка в том, что у вас слоты написаны так, что там происходит копирование, вместо взятия по ссылке...
Объявление должно быть следующим, соответственно и реализацию исправить нужно.
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 никак не относятся.
Также, рекомендую почитать про сигналы и слоты

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();
}

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

  • #
  • отредактировано4 августа 2018 г. 5:16
  • 4 августа 2018 г. 5:10

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

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

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

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

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 августа 2018 г. 19:02
Lord Inquisitoris

C++ - Тест 003. Условия и циклы

  • Результат 57баллов,
  • Очки рейтинга-2
15 августа 2018 г. 18:58
Lord Inquisitoris

C++ - Тест 005. Структуры и Классы

  • Результат 83баллов,
  • Очки рейтинга4
15 августа 2018 г. 9:29
Леха Завистович

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

  • Результат 86баллов,
  • Очки рейтинга6
Последние комментарии
10 августа 2018 г. 13:40
Alex

Работа с триггерными функциями в PostgreSQL

Приветствую! Если вы создаете новую таблицу, почему бы просто не сделать вьюху ? Просто от одного названия "триггер" как-то не хочется его использовать, а уж кода сколько писа...
10 августа 2018 г. 11:46
Евгений Легоцкой

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто. Пробовали добавить запись через adminer, перезапусти...
10 августа 2018 г. 11:34
Alex

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок. далее, лично в моем случае , я открываю adminer, и в эту таблицу добавляю еще одну зап...
Сейчас обсуждают на форуме
15 августа 2018 г. 14:06
Олег Корнев

Как подключить QtCharts в QML?

После некоторых манипуляций (переустановил креатор) смог запустить экземплы с использованием QtCharts, но все они работают с подключениями в файлах .pro .cpp, у меня таких файлов нет. Как...
14 августа 2018 г. 7:02
Ruslan-maniak

Переключение страниц и перевод фокуса на потомка новой страницы

Большое спасибо. Подтолкнули меня на мысль вынести обработку клавиш из PathView на всю страницу. И тогда - да, ваша подсказка работает. добавил в StackView onCurrentItemChanged: currentItem.fo...
14 августа 2018 г. 6:39
Евгений Легоцкой

Как сделать аудиовизуализацию для плеера на qt?

Добрый день. Просмотрите пример в Qt Creator, который на QML, там реализовано визуализация, возможно вам понравится использовать, QML, да и кастомные интерфейсы на нём всё-таки лучше...
11 августа 2018 г. 10:12
Евгений Легоцкой

Qt C++ vs QML

Добрый день. Если Андроид предполагается, то конечно нужно использовать QML. Я занимался разработкой арканоида на QML и ещё одной игры. Пытался реализовывать логику на QML, но это ...
11 августа 2018 г. 9:24
Евгений Легоцкой

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

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

Рекомендуемые страницы