U
Unreal_manAug. 1, 2018, 4:05 a.m.

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

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

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

1_9DAeMMx.png
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

39
U
  • Aug. 1, 2018, 4:01 a.m.

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

    U
    • Aug. 1, 2018, 4:02 a.m.

    И еще

      Evgenii Legotckoi
      • Aug. 1, 2018, 4:04 a.m.
      • (edited)

      Добрый день.

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

        U
        • Aug. 1, 2018, 4:09 a.m.
        • (edited)

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

          Evgenii Legotckoi
          • Aug. 1, 2018, 4:54 a.m.
          • (edited)

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

            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
              • Aug. 1, 2018, 11:58 p.m.

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

                Evgenii Legotckoi
                • Aug. 2, 2018, 2:57 a.m.

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


                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
                  • Aug. 2, 2018, 2:57 a.m.

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

                    U
                    • Aug. 4, 2018, 1:10 a.m.
                    • (edited)

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

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

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

                        Evgenii Legotckoi
                        • Aug. 11, 2018, 5:24 a.m.

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

                          U
                          • Dec. 12, 2018, 2:53 a.m.
                          • (edited)

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

                          В классе есть 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
                            • Dec. 12, 2018, 3:53 a.m.

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

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

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

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

                              U
                              • Dec. 12, 2018, 4:54 a.m.

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

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

                                U
                                • Dec. 12, 2018, 5:06 a.m.
                                • (edited)

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

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

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

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

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

                                  Evgenii Legotckoi
                                  • Dec. 12, 2018, 5:24 a.m.

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

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

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

                                    U
                                    • Dec. 12, 2018, 7:59 a.m.
                                    • (edited)

                                    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
                                      • Dec. 12, 2018, 8:06 a.m.

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

                                      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
                                        • Dec. 12, 2018, 8:11 a.m.

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

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

                                          U
                                          • Dec. 12, 2018, 8:13 a.m.

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

                                            Evgenii Legotckoi
                                            • Dec. 12, 2018, 8:17 a.m.

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

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

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

                                              U
                                              • Dec. 12, 2018, 8:25 a.m.
                                              • (edited)

                                              создайте отдельные 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
                                                • Dec. 12, 2018, 8:26 a.m.

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

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

                                                  Evgenii Legotckoi
                                                  • Dec. 12, 2018, 8:35 a.m.

                                                  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
                                                    • Dec. 12, 2018, 8:38 a.m.

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

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

                                                      U
                                                      • Dec. 12, 2018, 8:43 a.m.
                                                      • (edited)

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

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

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

                                                        Evgenii Legotckoi
                                                        • Dec. 12, 2018, 8:49 a.m.

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

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

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

                                                          U
                                                          • Dec. 15, 2018, 4:01 a.m.

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

                                                          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
                                                            • Dec. 15, 2018, 4:44 a.m.
                                                            • (edited)

                                                            Вы на правильном пути, но сигнатура 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
                                                              • Dec. 15, 2018, 10:08 p.m.
                                                              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
                                                                • Dec. 15, 2018, 11:09 p.m.

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

                                                                  Docent
                                                                  • Dec. 16, 2018, 5:18 a.m.

                                                                  В файле main

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

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

                                                                    Evgenii Legotckoi
                                                                    • Dec. 16, 2018, 6:26 a.m.

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

                                                                    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
                                                                      • Dec. 18, 2018, 5:39 a.m.

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

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

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

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

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

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

                                                                        Evgenii Legotckoi
                                                                        • Dec. 20, 2018, 3:40 a.m.

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

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

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

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

                                                                          U
                                                                          • Jan. 2, 2019, 2:36 a.m.

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

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

                                                                            U
                                                                            • Jan. 21, 2019, 9:26 a.m.

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

                                                                              Comments

                                                                              Only authorized users can post comments.
                                                                              Please, Log in or Sign up
                                                                              m

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

                                                                              • Result:85points,
                                                                              • Rating points6
                                                                              в

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

                                                                              • Result:50points,
                                                                              • Rating points-4
                                                                              l

                                                                              C++ - Test 005. Structures and Classes

                                                                              • Result:91points,
                                                                              • Rating points8
                                                                              Last comments
                                                                              k
                                                                              kmssrFeb. 9, 2024, 5:43 a.m.
                                                                              Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                                              Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                                              EVA
                                                                              EVADec. 25, 2023, 9:30 p.m.
                                                                              Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                                                              J
                                                                              JonnyJoDec. 25, 2023, 7:38 p.m.
                                                                              Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                                                              G
                                                                              GvozdikDec. 19, 2023, 8:01 a.m.
                                                                              Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                                                              Now discuss on the forum
                                                                              AC
                                                                              Alexandru CodreanuJan. 19, 2024, 10:57 p.m.
                                                                              QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
                                                                              BlinCT
                                                                              BlinCTDec. 27, 2023, 7:57 p.m.
                                                                              Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
                                                                              Дмитрий
                                                                              ДмитрийJan. 10, 2024, 3:18 p.m.
                                                                              Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
                                                                              Evgenii Legotckoi
                                                                              Evgenii LegotckoiDec. 12, 2023, 5:48 p.m.
                                                                              Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

                                                                              Follow us in social networks