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,и у него ли нужно вызывать?

                                                                              Комментарии

                                                                              Только авторизованные пользователи могут публиковать комментарии.
                                                                              Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                                                              e
                                                                              • ehot
                                                                              • 31 марта 2024 г. 21:29

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

                                                                              • Результат:78баллов,
                                                                              • Очки рейтинга2
                                                                              B

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

                                                                              • Результат:16баллов,
                                                                              • Очки рейтинга-10
                                                                              B

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

                                                                              • Результат:46баллов,
                                                                              • Очки рейтинга-6
                                                                              Последние комментарии
                                                                              k
                                                                              kmssr9 февраля 2024 г. 2:43
                                                                              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                                              АК
                                                                              Анатолий Кононенко5 февраля 2024 г. 9:50
                                                                              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                                              EVA
                                                                              EVA25 декабря 2023 г. 18:30
                                                                              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                                                              J
                                                                              JonnyJo25 декабря 2023 г. 16:38
                                                                              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                                                              G
                                                                              Gvozdik19 декабря 2023 г. 5:01
                                                                              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                                                              Сейчас обсуждают на форуме
                                                                              DA
                                                                              Dr Gangil Academics20 апреля 2024 г. 14:45
                                                                              Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                                                                              a
                                                                              a_vlasov14 апреля 2024 г. 13:41
                                                                              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                                                              Павел Дорофеев
                                                                              Павел Дорофеев14 апреля 2024 г. 9:35
                                                                              QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                                                              f
                                                                              fastrex4 апреля 2024 г. 11:47
                                                                              Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                                                                              P
                                                                              Pisych27 февраля 2023 г. 12:04
                                                                              Как получить в массив значения из связанной модели? Спасибо, разобрался:))

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