U
Unreal_manТам. 1, 2018, 4:05 Т.Ж.

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

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

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

1_9DAeMMx.png
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

39
U
  • Там. 1, 2018, 4:01 Т.Ж.

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

    U
    • Там. 1, 2018, 4:02 Т.Ж.

    И еще

      Evgenii Legotckoi
      • Там. 1, 2018, 4:04 Т.Ж.
      • (өңделген)

      Добрый день.

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

        U
        • Там. 1, 2018, 4:09 Т.Ж.
        • (өңделген)

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

          Evgenii Legotckoi
          • Там. 1, 2018, 4:54 Т.Ж.
          • (өңделген)

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

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

            Сделал как порекомендовали
              U
              • Там. 1, 2018, 11:58 Т.Қ.

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

                Evgenii Legotckoi
                • Там. 2, 2018, 2:57 Т.Ж.

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


                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();
                }
                
                  Evgenii Legotckoi
                  • Там. 2, 2018, 2:57 Т.Ж.

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

                    U
                    • Там. 4, 2018, 1:10 Т.Ж.
                    • (өңделген)

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

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

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

                        Evgenii Legotckoi
                        • Там. 11, 2018, 5:24 Т.Ж.

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

                          U
                          • Жел. 12, 2018, 2:53 Т.Ж.
                          • (өңделген)

                          Буду задавать свои вопросы здесь.

                          В классе есть QLineEdit* line_sum = new QLineEdit;
                          Так же в классе есть вложенный класс в котором(в public:) есть переменная QString sum, в которую надо записать значение введённое в QLineEdit line_sum. Создаю во вложенном классе метод
                          QString mthd()
                          {
                          sum = line_sum->text();
                          return sum;
                          }

                          Ругается так - ошибка: use of local variable with automatic storage from containing function
                          sum = lineEdt->text();
                          ^

                          Как сделать правильно?

                            Evgenii Legotckoi
                            • Жел. 12, 2018, 3:53 Т.Ж.

                            Буду задавать свои вопросы здесь.

                            Это, конечно, сильное заявление, но лучше бы вы для независящих вопросов создавали отдельные темы на форуме. Нескончаемый поток вопросов в одной теме только бардак разводит. А этот вопрос как раз не имеет никакого отношения к первоначальному вопросу. Не плодите оффтопы, пожалуйста.

                            А теперь к сути.

                            Проблема скорее всего в том, что вложенный класс не имеет доступа к членам класса, в который он вложен. Да и нужен ли этот класс, тоже очень сильно под вопросом.

                              U
                              • Жел. 12, 2018, 4:54 Т.Ж.

                              Проблема скорее всего в том, что вложенный класс не имеет доступа к членам класса, в который он вложен.

                              Что-то не соображу как этот доступ дать. QLineEdit line_sum в паблик секции, вложенный класс тоже, QString sum в паблик секции вложенного класса. Наведите на путь истинный, чего я здесь не учёл?

                                U
                                • Жел. 12, 2018, 5:06 Т.Ж.
                                • (өңделген)

                                Проблема скорее всего в том, что вложенный класс не имеет доступа к членам класса, в который он вложен.

                                Что-то не соображу как этот доступ дать. QLineEdit line_sum в паблик секции, вложенный класс тоже, QString sum в паблик секции вложенного класса. Наведите на путь истинный, чего я здесь не учёл?

                                Да и нужен ли этот класс, тоже очень сильно под вопросом.

                                Моя задумка в том чтобы каждый раз когда я перехожу в окно с вводом параметров(где все эти QLineEdit сидят) создавался бы объект вложенного класса имеющий в себе переменные QString, которые хранили бы в себе всю введённую инфу, и далее отсюда записывались в лог.

                                Как тут удалить сообщение?

                                  Evgenii Legotckoi
                                  • Жел. 12, 2018, 5:24 Т.Ж.

                                  Лучше покажите программный код класса со вложенным классом полностью ))

                                  Как тут удалить сообщение?

                                  Пока никак, некоторые вещи или в планах или в стадии разработки. Думаю, что добавлю модуль идей и предложений на сайт. Тогда дело лучше пойдёт в плане фидбека.

                                    U
                                    • Жел. 12, 2018, 7:59 Т.Ж.
                                    • (өңделген)

                                    widget.cpp

                                    Widget::Widget(QWidget *parent) :
                                        QWidget(parent),
                                        ui(new Ui::Widget)
                                    {
                                        ui->setupUi(this);
                                    
                                        QDateEdit* dateEdit = new QDateEdit(QDate::currentDate());
                                        QLineEdit* line_sum = new QLineEdit;
                                        QLineEdit* line_det = new QLineEdit;
                                        QComboBox* ctgs = new QComboBox;
                                    
                                        class Cell
                                        {
                                        public:
                                            QDate* date = new QDate(QDate::currentDate());
                                            QString sum;
                                            QString* category = new QString;
                                            QString* details = new QString;
                                            QString* str = new QString;
                                            QString wSum()
                                            {
                                                sum = line_sum->text();
                                                return sum;
                                            }
                                        };
                                    }
                                    

                                    Я тут уже и QString sum просто так создал, не выделял динамическую память. Кстати на что это может повлиять, и может лучше создавать sum как указатель?

                                    Это будет типа окошко в котором я буду вводить данные о расходах/доходах. В QComboBox будут категории, в остальных дата, сумма и подробности.

                                      Evgenii Legotckoi
                                      • Жел. 12, 2018, 8:06 Т.Ж.

                                      Как минимум вот это...

                                      class Cell
                                          {
                                          public:
                                              QDate* date = new QDate(QDate::currentDate());
                                              QString sum;
                                              QString* category = new QString;
                                              QString* details = new QString;
                                              QString* str = new QString;
                                              QString wSum()
                                              {
                                                  sum = line_sum->text();
                                                  return sum;
                                              }
                                          };
                                      

                                      Убрать из конструктора вообще. Никто так не пишет, ни одно код-ревью это не пройдёт, если вообще заработает.

                                      Убрать до заголовочного файла. А там уже поговорим дальше.

                                        U
                                        • Жел. 12, 2018, 8:11 Т.Ж.

                                        Это будет типа окошко в котором я буду вводить данные о расходах/доходах. В QComboBox будут категории, в остальных дата, сумма и подробности. Я думаю чтоб заходя в это окно сразу создавался объект Cell a(); ну и там уже на основании введённого в поля, данные сохранять в a.sum, a.category, и т.п.

                                        Насчёт скудности знаний знаю. Просьба не отправлять учить плюсы(это ответ в общем плане), а исходить из того что есть(в моей голове), конечно замечая и поправляя меня в нужном конкретно здесь направлении. Заранее спасибо.

                                          U
                                          • Жел. 12, 2018, 8:13 Т.Ж.

                                          Т.е. мне надо описать Cell.h и Cell.cpp?

                                            Evgenii Legotckoi
                                            • Жел. 12, 2018, 8:17 Т.Ж.

                                            Вы можете описать Cell и внутри Widget, но делать это нужно в Widget.h, но лучше делайте всё сначала в отдельных файлах, чтобы не собирать специфические грабли раньше времени.

                                            В конструкторе будет локальная видимость только внутри конструктора. Если и получится использовать данный класс, то только внутри конструктора. В общем не делайте никогда подобного, если реально не будет такой необходимости.

                                            Так что да, создайте отдельные Cell.h и Cell.cpp. Это будет лучше и чище.

                                              U
                                              • Жел. 12, 2018, 8:25 Т.Ж.
                                              • (өңделген)

                                              создайте отдельные Cell.h и Cell.cpp

                                              cell.h

                                              #ifndef CELL_H
                                              #define CELL_H
                                              #include <QString>
                                              #include <QDate>
                                              
                                              class Cell
                                              {
                                              public:
                                                  QDate* date;
                                                  QString sum;
                                                  QString category;
                                                  QString details;
                                                  QString str;
                                                  void wSum();
                                              };
                                              
                                              #endif // CELL_H
                                              
                                              

                                              cell.cpp

                                              #include "widget.h"
                                              #include "cell.h"
                                              
                                              class Cell
                                              {
                                              public:
                                                  QDate* date = new QDate(QDate::currentDate());
                                                  QString sum;
                                                  QString* category = new QString;
                                                  QString* details = new QString;
                                                  QString* str = new QString;
                                                  QString wSum()
                                                  {
                                                      sum = line_sum->text();
                                                      return sum;
                                                  }
                                              };
                                              

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

                                                Evgenii Legotckoi
                                                • Жел. 12, 2018, 8:26 Т.Ж.

                                                Просьба не отправлять учить плюсы

                                                и извиняюсь, если показался несколько резковатым. Просто в осадок немного выпал, что вам в голову пришло такое. Но ничего, подучитесь, поднатореете и всё нормально будет.

                                                  Evgenii Legotckoi
                                                  • Жел. 12, 2018, 8:35 Т.Ж.

                                                  cell.h

                                                  #ifndef CELL_H
                                                  #define CELL_H
                                                  #include <QString>
                                                  #include <QDate>
                                                  
                                                  class Cell
                                                  {
                                                  public:
                                                      QDate* date;
                                                      QString sum;
                                                      QString category;
                                                      QString details;
                                                      QString str;
                                                      void wSum();
                                                  };
                                                  
                                                  #endif // CELL_H
                                                  
                                                  

                                                  cell.cpp

                                                  #include "cell.h"
                                                  
                                                  Cell::Cell()
                                                  {
                                                      date = new QDate(QDate::currentDate());
                                                  }
                                                  
                                                  QString Cell::wSum(const QString& fromLineSum) 
                                                  {
                                                      sum = fromLineSum;
                                                      return sum;
                                                  }
                                                  

                                                  И потом где-нибудь внутри виджета

                                                  Cell c;
                                                  c.wSum(line_sum->text());
                                                  

                                                  Но подучить c++ вам действительно нужно, рекомендую параллельно почитать про основы C++ , классы

                                                    U
                                                    • Жел. 12, 2018, 8:38 Т.Ж.

                                                    подучитесь, поднатореете

                                                    Евгений, хороший мой, у меня нет времени учиться. Поймите, я не могу вот это вот всё "ай кьюти 10 вышел!", "ай надо установить кьюти 10!", "ай, а тут класс новый вышел!", "ай то!", "ай сё!". Я должен делать так как могу на данный момент. Посмотрите сколько времени прошло с момента создания темы. Приложение до сих пор не написано. Понимаете, просто когда в книге пишут создавай QPushButton, клади его на QVBoxLayout и наноси на QStckedWidget(в обратном порядке конечно же=)), а в жизни работает создание кнопок через вектор и ui->QPushButton, и прочие неведомые навороты... Честно, извините, но у меня нет времени учиться ВЕЧНО. Постарался покороче. Надеюсь поймёте(а то уже руки опускаются).

                                                      U
                                                      • Жел. 12, 2018, 8:43 Т.Ж.
                                                      • (өңделген)

                                                      И потом где-нибудь внутри виджета

                                                      Cell c;
                                                      c.wSum(line_sum->text());
                                                      Но подучить c++ вам действительно нужно, рекомендую параллельно почитать про основы C++ , классы

                                                      Спасибо. Буду осваивать. Насчёт подучить. Очень много ресурсов это требует к сожалению. У меня в черепной коробке не самый мега мозг для этого, но я учту Ваши советы. Спасибо. Даже так: Я всё прекрасно понимаю, но каждый раз я перехожу с Си на кьюти, и каждый раз возвращаюсь назад. Просто помогите мне протиснуться с теми знаниями которые у меня есть сейчас. Я отдаю себе отчёт, что в будущем я скажу Вам огромное спасибо за то что Вы не дали мне конкретно то что я хотел бы услышать, а указали мне на пробелы.

                                                        Evgenii Legotckoi
                                                        • Жел. 12, 2018, 8:49 Т.Ж.

                                                        но у меня нет времени учиться ВЕЧНО

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

                                                        Никогда не говорю просто так кому-то, что нужно подучить и подтянуть знания, только когда это реально нужно. Иначе вся тема превратится не в помощь в каком-то вопросе, а в моём написании вашей программы.

                                                          U
                                                          • Жел. 15, 2018, 4:01 Т.Ж.

                                                          И потом где-нибудь внутри виджета

                                                          Cell c;
                                                          c.wSum(line_sum->text());

                                                          1)OK. Я создаю слот void Widget::addObject(); для того чтобы при нажатии кнопки(пусть будет "Ввести данные") создавался объект класса Cell, и в его поля записались данные из полей ввода на странице QStackedWidget. Вижу я это так:

                                                          void Widget::addObject()
                                                          {
                                                                Cell a;
                                                                a.wSum(line_sum->text);
                                                          
                                                          //немного тут изменил код, сделал метод wSum следующим образом
                                                          
                                                                a.wSum()
                                                                {
                                                                       sum = line_sum->text();
                                                                       return sum;
                                                                 }
                                                          
                                                          

                                                          2)Теперь хочу в этом же слоте вызвать метод addToText(); для записи данных в файл.
                                                          Я полагаю что мне нужно передать в конструктор addToText(const QString& s);, т.е. сделать так:

                                                          void Widget::addObject()
                                                          {
                                                                Cell a;
                                                                a.wSum(line_sum->text);
                                                                addToText(&sum);
                                                          }
                                                          
                                                          void Widget::addToText(const QString& s)
                                                          {
                                                                QFile file("1.txt");
                                                                QTextStream stream(&file);
                                                                stream << s << '\n';
                                                                file.close();
                                                          }
                                                          
                                                          

                                                          Прошу меня поправить и указать где я возможно допустил ошибки.

                                                          3)Я хочу в addWidget сделать коннект чтобы по нажатии кнопки ui->ok вызывался слот addToText(const QString& s);. Как это сделать правильно?

                                                          void Widget::addObject()
                                                          {
                                                                Cell a;
                                                                a.wSum(line_sum->text);
                                                                connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText());
                                                          }
                                                          

                                                          Что передавать в addToText? a.sum? Cell::a.sum? Cell::sum? По-всякому уже пробовал, засыпает меня ошибками. Много часов потратил на этот маленький кусок кода прежде чем написать сюда. Сил больше нет, покажите как надо.

                                                            Evgenii Legotckoi
                                                            • Жел. 15, 2018, 4:44 Т.Ж.
                                                            • (өңделген)

                                                            Вы на правильном пути, но сигнатура addText должна выглядеть иначе

                                                            Только так в данном случае

                                                            void Widget::addToText()
                                                            

                                                            Потому, что сигнал clicked

                                                            имеет следующую сигнатуру
                                                            void QAbstractButton::clicked(bool checked = false)
                                                            

                                                            В данном случае слот должен быть совместимым с сигнатурой clicked, а значит может иметь только два варианта сигнатуры

                                                            void Widget::addToText()
                                                            void Widget::addToText(bool checked = false)
                                                            

                                                            Вам не интересе второй вариант, поскольку check состояния вы не используете, поэтому используем первый вариант.

                                                            Но, по моему мнению коннект должен быть у вас другой.
                                                            Примерно такой

                                                            connect(ui->ok3, &QPushButton::clicked, this, &Widget::addObject);
                                                            

                                                            Причём его нужно располагать в конструкторе Widget.

                                                            По мне так в addText можно сразу добавить текст из строки ввода,

                                                            addToText(line_sum->text);
                                                            

                                                            либо взять текст из Cell объекта.

                                                            addToText(a.sum);
                                                            

                                                            И файл нужно открывать на запись, кстати.

                                                            if (file.open(QIODevice::WriteOnly))
                                                            {
                                                            }
                                                            
                                                              U
                                                              • Жел. 15, 2018, 10:08 Т.Қ.
                                                              void Widget::addObject()
                                                              {
                                                                  Cell a;
                                                                  connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText);
                                                              }
                                                              void Widget::addToText()
                                                              {
                                                                  QFile file("1.txt");
                                                                  QString str;
                                                                  QTextStream ts(&file);
                                                                  if(file.open(QIODevice::WriteOnly))
                                                                  {
                                                                      ts << "Date: " << Cell::date->toString(str) << '\n';
                                                                      ts << "Sum: " << Cell::sum << '\n';
                                                                      ts << "Category: " << Cell::category << '\n';
                                                                      ts << "Details: " << Cell::details << '\n';
                                                                      ts << "***************" << '\n';
                                                                      file.close();
                                                                  }
                                                              }
                                                              

                                                              Вот что я смог выжать из объяснения. Насыпает ошибки там где я вызываю поля. Мне неясно как в addToText() передавать поля объекта Cell если сигнатуры сигнала и слота обязаны быть одинаковыми. Вызов Cell::sum не работает. Так как мне описать здесь работу метода addToText?
                                                              Ну и возможно ещё какие ошибки здесь есть.

                                                                U
                                                                • Жел. 15, 2018, 11:09 Т.Қ.

                                                                И ещё вопрос: что и где нужно указать чтоб размеры приложения автоматом подстроились под экран? У меня дисплей 1440х2560, но на телефонах с меньшим дисплеем приложение наверное будет некорректно отображаться, да и мне в редакторе, если я укажу такие размеры будет не удобно редактировать такую махину. Сейчас у меня стоят какие-то маленькие размеры - 303х491(подсмотрел ге-то в видео на ютубе). В принципе можно и так оставить(на компе в редакторе помещается без скроллов и ладно), но если есть какая-то технология правильная по подстройке размеров, то буду благодарен за совет.

                                                                  Docent
                                                                  • Жел. 16, 2018, 5:18 Т.Ж.

                                                                  В файле main

                                                                  QApplication a(argc, argv);
                                                                  MainWindow w;
                                                                  w.setGeometry(0, 0, a.desktop()->width(), a.desktop()->height());
                                                                  

                                                                  Размещение всех компонентов делайте используя Layouts, для каждого объекта указывайте минимальные/максимальные размеры при растяжениях/сжатиях, параметры их поведения. Тогда при изменениях размера окна будут изменяться и размеры элементов. Можно усложнить задачу и при различных размерах перемещать элементы в разные группы, но это уже потом, после освоения Layouts.

                                                                    Evgenii Legotckoi
                                                                    • Жел. 16, 2018, 6:26 Т.Ж.

                                                                    Только статические методы и участники класса можно вызывать подобным образом

                                                                    Cell::sum
                                                                    

                                                                    У вас же они нестатические, чтобы их вызывать, нужно иметь объект Cell.

                                                                    Вы его, конечно, создаёте, но он существует только в области видимости метода.

                                                                    void Widget::addObject()
                                                                    {
                                                                        Cell a;
                                                                        connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText);
                                                                    }
                                                                    

                                                                    А вот этот коннект здесь и вовсе не нужен

                                                                    connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText);
                                                                    

                                                                    Я вам писал, что коннекты для этого нужно расположить в конструкторе класса. Это то место, куда вы вначале записывали вложенный класс.

                                                                    Ещё почитайте о сигналах и слотах вот в этой статье , чтобы разобраться как они работают.

                                                                      U
                                                                      • Жел. 18, 2018, 5:39 Т.Ж.

                                                                      А вот этот коннект здесь и вовсе не нужен

                                                                      connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText);
                                                                      

                                                                      А как же без него?

                                                                      ==============================

                                                                      Только статические методы и участники класса можно вызывать подобным образом

                                                                      Это значит надо думать в сторону вложенного класса или создавать поля прямо в Widget убирая Cell вообще? Совсем голова уже не думает.

                                                                        Evgenii Legotckoi
                                                                        • Жел. 20, 2018, 3:40 Т.Ж.

                                                                        Коннект нужен, но не внутри метода, а внутри конструктора класса. Я вам это уже третий раз пишу.

                                                                        Это значит надо думать в сторону вложенного класса или создавать поля прямо в Widget убирая Cell вообще?

                                                                        В вашем случае лучше создать поля внутри Widget. От того, что вы создадите вложенный класс, ничего не изменится, вы всё равно не понимаете, что такое статические поля и нестатические.

                                                                        Статическое поле существует в одном экземпляре всегда, поскольку относится не к конкретному объекту, а к классу.

                                                                          U
                                                                          • Қаң. 2, 2019, 2:36 Т.Ж.

                                                                          Помогайте, целый день убил. Пишу валидатор для ввода суммы. Как должно выглядеть регулярное выражение чтобы первым символом вводился либо "-" либо 1-9? Вторая часть выполняется корректно (...[0-9]{1-9}), а первую никак не могу правильно написать, как ни пытаюсь. Остановился пока на ([1-9-]{1}[0-9]{1-9}), но при этом выходит так что первый символ может быть и буквой(рус.,англ.), после ввода первого символа буквы уже не вводятся.

                                                                          Как в кьюте сделать чтоб при нажатии на lineEdit открывалась цифровая клавиатура, а при нажатии на dateEdit открывался виджет календаря(или что там на андроиде должно открываться)?

                                                                            U
                                                                            • Қаң. 21, 2019, 9:26 Т.Ж.

                                                                            Подскажите как сделать чтоб при нажатии на строку в QTableWidget вызывался мой метод? В дизайнере установил чтобы кликались только строки и это работает, вот только привязать к нажатию действие у меня не получается. Какой метод мне нужно вызвать у QTableWidget,и у него ли нужно вызывать?

                                                                              Пікірлер

                                                                              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                                              Кіріңіз немесе Тіркеліңіз
                                                                              Г

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

                                                                              • Нәтиже:66ұпай,
                                                                              • Бағалау ұпайлары-1
                                                                              t

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

                                                                              • Нәтиже:33ұпай,
                                                                              • Бағалау ұпайлары-10
                                                                              t

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

                                                                              • Нәтиже:52ұпай,
                                                                              • Бағалау ұпайлары-4
                                                                              Соңғы пікірлер
                                                                              G
                                                                              GoattRockҚыр. 3, 2024, 10:50 Т.Ж.
                                                                              Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                                                                              d
                                                                              dblas5Шілде 5, 2024, 8:02 Т.Ж.
                                                                              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                                              k
                                                                              kmssrАқп. 8, 2024, 3:43 Т.Қ.
                                                                              Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                                              АК
                                                                              Анатолий КононенкоАқп. 4, 2024, 10:50 Т.Қ.
                                                                              Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                                              Енді форумда талқылаңыз
                                                                              Evgenii Legotckoi
                                                                              Evgenii LegotckoiМаусым 24, 2024, 12:11 Т.Қ.
                                                                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                                              F
                                                                              FynjyШілде 22, 2024, 1:15 Т.Ж.
                                                                              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                                                                              BlinCT
                                                                              BlinCTМаусым 24, 2024, 10 Т.Қ.
                                                                              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                                                              BlinCT
                                                                              BlinCTМамыр 5, 2024, 2:46 Т.Ж.
                                                                              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                                                              Evgenii Legotckoi
                                                                              Evgenii LegotckoiМамыр 2, 2024, 11:07 Т.Ж.
                                                                              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                                                                              Бізді әлеуметтік желілерде бақылаңыз