U
Unreal_man1 августа 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 г. 23: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 г. 23: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 г. 22: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 г. 23: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,и у него ли нужно вызывать?

                                                                              Комментарии

                                                                              Только авторизованные пользователи могут публиковать комментарии.
                                                                              Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                                                              AD

                                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                                              • Результат:50баллов,
                                                                              • Очки рейтинга-4
                                                                              m
                                                                              • molni99
                                                                              • 26 октября 2024 г. 8:37

                                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                                              • Результат:80баллов,
                                                                              • Очки рейтинга4
                                                                              m
                                                                              • molni99
                                                                              • 26 октября 2024 г. 8:29

                                                                              C++ - Тест 004. Указатели, Массивы и Циклы

                                                                              • Результат:20баллов,
                                                                              • Очки рейтинга-10
                                                                              Последние комментарии
                                                                              i
                                                                              innorwall15 ноября 2024 г. 10:27
                                                                              Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box) optionally substituted alkoxy, optionally substituted alkenyloxy, optionally substituted alkynyloxy, optionally substituted aryloxy, OCH, OC H, OC H, OC H, OC H, OC H, OC H, O C CH, OCH CH OH, O…
                                                                              i
                                                                              innorwall15 ноября 2024 г. 5:26
                                                                              Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
                                                                              i
                                                                              innorwall15 ноября 2024 г. 3:03
                                                                              Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                                                                              i
                                                                              innorwall14 ноября 2024 г. 19:42
                                                                              Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                                                              Сейчас обсуждают на форуме
                                                                              i
                                                                              innorwall14 ноября 2024 г. 11:39
                                                                              добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                                                              i
                                                                              innorwall11 ноября 2024 г. 18:55
                                                                              Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                                                              9
                                                                              9Anonim25 октября 2024 г. 16:10
                                                                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                                                              ИМ
                                                                              Игорь Максимов3 октября 2024 г. 11:05
                                                                              Реализация навигации по разделам Спасибо Евгений!

                                                                              Следите за нами в социальных сетях