Arrow
ArrowJan. 30, 2017, 2:22 p.m.

Работа с динамическими компонентами

QPushButton

Помогите разобраться в чем проблема.

Идея такая:

Есть layout под именем btnLayout в который динамически добавляются кнопки при выполнении пользователем определенных действий.

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

В дизайнере создан btnLayout (горизонтальный) в который динамически добавляются кнопки (изначально он пустой). Этот btnLayout вместе с кнопкой (someButton) и спейсером между ними помещен в горизонтальный layout.

В низу фрагмент моего кода для реализации этого:


// В хедере
void addButton();

QPushButton *btn[20];

qint64 btnCount = 0;

// Реализация
void MainWindow::addButton()
{
    btnCount++;

    btn[btnCount] = new QPushButton(this);

    // Стиль кнопки
    btn[btnCount]->setStyleSheet(StyleHelper::getButtonStyleSheet());

    // Настройка свойств кнопки
    btn[btnCount]->setCheckable(true);
    btn[btnCount]->setChecked(true);
    btn[btnCount]->setText("Текст");

    ui->btnLayout->addWidget(btn[btnCount]);

    
    QString s = "...";
    qint64 num = btnCount;
    connect(btn[btnCount], &QPushButton::clicked, [this, s, num] {
        nTString(s);

        // Удалить все последующие кнопки
        for(int i = num+1; i <= btnCount; i++)
        {
            disconnect(btn[i]);
            delete btn[i];

            // Уменьшить счетчик
            btnCount--;
        }
    });

    // Снять выделение с предыдущей кнопки
    if(btnCount > 0) btn[btnCount-1]->setChecked(false);
}

Компиляция проходит успешно и работает.

Самое интересное начинается если для кнопки someButton добавить обработчик onClick. Тогда при запуске программа аварийно завершает работу.

При отладке выяснил, что вылет происходит на строке:

if(btnCount > 0) btn[btnCount-1]->setChecked(false);

При отладке появляется окно с текстом о том, что программа завершила свою работу получив соответствующее сообщение от ОС.

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

Но если количество динамически созданных кнопок более 5-ти, то удаляются все кнопки после текущей за исключением самой последней (ее тоже нужно удалять).

Не могу понять чем обработчик события onClick и строка

if(btnCount > 0) btn[btnCount-1]->setChecked(false);
не понравились друг другу :).
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!

37
Evgenii Legotckoi
  • Jan. 30, 2017, 11:52 p.m.

Здесь снимается выделение всё-таки не с предыдущей кнопки, а с текущей. Если количество кнопок btnCount = 20, то номер текущей кнопки будет равен 19. Счёт у программистов начинается с 0. ;-)

if(btnCount > 0) btn[btnCount-1]->setChecked(false);

Что это за nTString ? - это какой-то метод класса?

Насколько помню объекты объявленные в стеке лучше захватывать лямбдой через ссылку:

connect(btn[btnCount], &QPushButton::clicked, [this,  &s, &num] {

    });

Учитывая, что QPushButton - это объект, который наследован от QObject, то попробуйте удалять его соответствующим методом, а не через оператор delete . Это снимает некоторые проблемы, если объект где-то ещё используется.

btn[i]->deleteLater();

Но самой главной проблемой я считаю использование btnCount и num . Скорее всего, в какой-то момент происходит OutOfRange . Для num память выделяется в стеке локально в методе, и когда метод заканчивает работу, то память для num очищается, поэтому лямбда функция захватывает протухшую память. Если бы было выделение памяти в куче через указатель, то тогда всё работало бы правильно, а тут Undefined Behaviour получается.

Совет такой: Избавьтесь от использования btnCount и num . Замените строго заданный массив указателей на QPushButton на QVector. В нём всегда можно узнать количество элементов с помощью метода length() и номер текущего элемента с помощью метода indexOf() . А доводить до ума текущий код не стоит - это решение, которое в будущем создаст больше проблем.

    Arrow
    • Jan. 31, 2017, 10:09 a.m.

    Спасибо!

    Я как-то о проблемах с памятью не подумал.

    Про счет с нуля знаю :), но пишу btnCount++ - и начинаю счет с 1. :)

    С векторами в Qt никогда не работал - по документации получилось, что-то такое:

    
    // В хедере
    
    void addButton();
    
    QVector vector;
    
    // Реализация
    
    void MainWindow::addButton()
    {
        vector.append(new QPushButton());
        vector.last()->setStyleSheet(StyleHelper::getButtonStyleSheet());
        
    // Настройка свойств кнопки
        vector.last()->setMinimumHeight(35);
        vector.last()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
        vector.last()->setCheckable(true);
        vector.last()->setChecked(true);
        vector.last()->setText(QFileInfo(dir.path()).fileName());
        
    // Добавить в btnLayout
        ui->btnLayout->addWidget(vector.last());
    
        // Сигнал нажатия кнопки
        QString s = dir.path();
        QPushButton *b = vector.last();
        connect(vector.last(), &QPushButton::clicked, [this, s, b] {
            // mainList  - QListView, model - QFileSystemModel
            ui->mainList->setRootIndex(model->index(s));
    
            // Удалить все последующие кнопки
            for(int i = vector.indexOf(b)+1; i < vector.length(); i++)
            {
                disconnect(vector[i);
                vector[i]->deleteLater();
            }
        });
    
        if(vector.length() > 1) vector[vector.indexOf(b)-1]->setCheckable(false);
    }
    

    Если писать так:

    connect(vector.last(), &QPushButton::clicked, [this, &s, &b] 
    

    программа вылетает с аварийным сообщением.

    Все работает корректно, только после клика на кнопке выполнить действие для добавления еще одной - вылетает с надписью: Поток 0 остановлен по причине: Exception at 0x51f01fd4, read access violation.

    Вылет на строке:

    vector[i]->deleteLater();
    

    Если выполнить действие для удаления кнопки, то с тем же сообщением на строке:

    if(vector.length() > 1) vector[vector.indexOf(b)-1]->setCheckable(false);
    

    Так понимаю, что это ошибка доступа к памяти - ссылку на кнопку теряет?

    И вопрос попутно как в отладчике в Qt Creator посмотреть значения переменных, например s из кода выше (кроме qDebug << s;). Я имею ввиду, что-то похожее на то как в отладчике MSVS.

      Arrow
      • Jan. 31, 2017, 10:11 a.m.
      QVector<QPushButton*> vector;
      
        Evgenii Legotckoi
        • Jan. 31, 2017, 10:32 a.m.

        Про счет с нуля знаю :), но пишу btnCount++ - и начинаю счет с 1. :)
        Это неочевидный грязный хак. Такие вещи не должны проходить код-ревью, и должны отправляться на переписывание кода. К тому же... А вы не задумывались, что тогда в Вашем массиве QPushButton *btn[20]; на нулевом индексе будет находиться мусор, вместо указателя на первую добавленную кнопку? В р

        Теперь я догадываюсь, где ошибка.

        if(btnCount > 0) btn[btnCount-1]->setChecked(false);
        

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

        Подумайте сами. btnCount равен 1, когда Вы добавили одну кнопку. И тогда Вы пытаетесь снять выделение с предыдущей кнопки, btnCount - 1, и получается 0. обращаетесь к элементу с индексом 0, к мусору. Естественно, что программа вылетала. Вы сами себе накидали граблей.

        В ниже следующем куске кода явно ошибка, это вы так скопипастили из Креатора?

        disconnect(vector[i);
        vector[i]->deleteLater();
        
        Если писать так:
        connect(vector.last(), &QPushButton::clicked, [this, &s, &b] 
        
        программа вылетает с аварийным сообщением.

        Правильно, что ошибку выдаёт, у вас же b - это указатель, объект сохранён в куче. Для него память выделена через new. Его нельзя по ссылке захватить.

        connect(vector.last(), &QPushButton::clicked, [this, &s, b] 
        
        Вылет на строке:
        vector[i]->deleteLater();
        
        Если выполнить действие для удаления кнопки, то с тем же сообщением на строке:
        if(vector.length() > 1) vector[vector.indexOf(b)-1]->setCheckable(false);
        

        Может наоборот?

          Arrow
          • Jan. 31, 2017, 1:25 p.m.
          Про счет с нуля знаю :), но пишу btnCount++ - и начинаю счет с 1. :) Это неочевидный грязный хак. Такие вещи не должны проходить код-ревью, и должны отправляться на переписывание кода.

          Понятно, больше так писать. не буду.

          В ниже следующем куске кода явно ошибка, это вы так скопипастили из Креатора?
          disconnect(vector[i);
          vector[i]->deleteLater();
          

          Да и к сожалению что не так не знаю.

          Такая конструкция работать отказывается - ошибка:

          connect(vector.last(), &QPushButton::clicked, [this, &s, b] 
          

          Работает так:

          connect(vector.last(), &QPushButton::clicked, [this, s, b] 
          
          Может наоборот?

          Да.

            Evgenii Legotckoi
            • Jan. 31, 2017, 1:31 p.m.

            Я имел ввиду то, что написано неправильно:

            disconnect(vector[i);
            

            Правильное написание:

            disconnect(vector[i]);
            

            Qt Creator разве не подсвечивал этот кусок?

              Arrow
              • Jan. 31, 2017, 1:33 p.m.

              Туплю, скобки не заметил, в креаторе все правильно написано.

                Arrow
                • Jan. 31, 2017, 1:35 p.m.

                И все таки, что может быть не так в коде?

                И как просматривать значения переменных в отладчике в Qt Creator?

                  Evgenii Legotckoi
                  • Jan. 31, 2017, 1:37 p.m.

                  Так, а что с объявлением QVector? Это просто здесь так написали?

                  QVector vector;
                  

                  Или в коде это выглядит как положено?

                  QVector<QPushButton *> vector;
                  
                    Arrow
                    • Jan. 31, 2017, 1:39 p.m.

                    В коде второй вариант. В первом случае почему-то скопировал не все.

                      Evgenii Legotckoi
                      • Jan. 31, 2017, 1:45 p.m.

                      Кажется знаю. Объект удалить-то удалили через deleteLater, но в самом QVector указатель-то остался. Нужно добавить ещё и удаление элемента из QVector

                      disconnect(vector[i);
                      vector[i]->deleteLater();
                      

                      То есть будет так:

                      disconnect(vector[i);
                      vector[i]->deleteLater();
                      vector.remove(i);
                      
                        Arrow
                        • Jan. 31, 2017, 1:46 p.m.

                        Еще один вопрос немного не по теме - как обновить отображаемые в QListView данные? repain и update - не выолняют нужного действия.

                          Evgenii Legotckoi
                          • Jan. 31, 2017, 1:51 p.m.

                          repaint и update только перерисовывают сам QListView с содержимым. Чтобы их обновить, необходимо обновить сами данные. Если данные не обновлялись, то выше приведённые методы не окажут видимого эффекта.

                          И что касается значений переменных в отладчике, во время отладки обычно открывается справа панелька с таблицей, где можно посмотреть какие в данный момент переменные активны и их содержимое.

                            Arrow
                            • Jan. 31, 2017, 1:51 p.m.

                            Да работает, только все равно если кнопок больше двух последнюю кнопку не удаляет.

                            Цикл выглядит так:

                            for(int i = vector.indexOf(b)+1; i < vector.length(); i++)
                                    {
                                        disconnect(vector[i]);
                                        vector[i]->deleteLater();
                                        vector.remove(i);
                                    }
                            
                              Arrow
                              • Jan. 31, 2017, 1:55 p.m.

                              Спасибо с обновлением данных в QListView понятно куда копать.

                              В отладчике таблицы нет, панель есть, но пустая.

                                Evgenii Legotckoi
                                • Jan. 31, 2017, 1:58 p.m.

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

                                while(vector.last() != b)
                                {
                                    disconnect(vector.last());
                                    vector.last()->deleteLater();
                                    vector.removeLast();
                                }
                                
                                  Evgenii Legotckoi
                                  • Jan. 31, 2017, 2 p.m.

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

                                    Arrow
                                    • Jan. 31, 2017, 2 p.m.

                                    Спасибо! Работает.

                                      Arrow
                                      • Jan. 31, 2017, 2:04 p.m.

                                      Спасибо, понял. Плюс нужно было поставить выбрать пункт - показывать локальные переменные.

                                        Arrow
                                        • Jan. 31, 2017, 2:09 p.m.

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

                                          Evgenii Legotckoi
                                          • Jan. 31, 2017, 2:11 p.m.

                                          Ну это уже издержки производства.

                                            Arrow
                                            • Jan. 31, 2017, 2:15 p.m.

                                            Согласен :)

                                              Arrow
                                              • Jan. 31, 2017, 2:20 p.m.

                                              Еще вопросик. Решил стилизировать меню через QSS и написал такое:

                                              QString StyleHelper::getMenuStyleSheet()
                                              {
                                                  return "QMenu {"
                                                              "background-color: #fff;"
                                                              "border: none;"
                                                              "border-radius: 0px;"
                                                              "margin: 2px;"
                                                              "}"
                                                              "QMenu::item:selected {"
                                                              "color: #111;"
                                                              "background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1,"
                                                                      "stop: 0 #fff, stop: 1 #eef);"
                                                              "}"
                                                              "QMenu::separator {"
                                                              "height: .5px;"
                                                              "background: #eee;"
                                                              "margin-left: 10px;"
                                                              "margin-right: 5px;"
                                                              "}"
                                                              "QMenu::indicator:non-exclusive:checked {"
                                                              "image: url(:/pict/check.png);"
                                                              "}"
                                                              "QMenu::indicator:non-exclusive:unchecked {"
                                                              "image: url(:/pict/unchecked.png);"
                                                              "}";
                                              }
                                              

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

                                              Как можно убрать этот прямоугольник?

                                                Arrow
                                                • Jan. 31, 2017, 2:30 p.m.
                                                • The answer was marked as a solution.

                                                Спасибо за помощь!

                                                Если читателям форума понадобится, вот отредактированный рабочий код:

                                                // Хедер *.h
                                                
                                                // Добавить кнопку директории на панель
                                                    void addButton();
                                                
                                                // Кнопки
                                                    QVector<QPushButton*> vector;
                                                
                                                // Реализация *.cpp
                                                
                                                void MainWindow::addButton()
                                                {
                                                    // Добавить кнопку
                                                
                                                    vector.append(new QPushButton());
                                                    vector.last()->setStyleSheet(StyleHelper::getButtonStyleSheet());
                                                
                                                    // Настройка свойств кнопки
                                                    vector.last()->setMinimumHeight(35);
                                                    vector.last()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
                                                    vector.last()->setCheckable(true);
                                                    vector.last()->setChecked(true);
                                                    vector.last()->setText(QFileInfo(dir.path()).fileName());
                                                    // Добавить в Layout
                                                    ui->btnLayout->addWidget(vector.last());
                                                
                                                    // Сигнал нажатия кнопки
                                                    QString s = dir.path();
                                                    QPushButton *b = vector.last();
                                                    connect(vector.last(), &QPushButton::clicked, [this, s, b] {        
                                                        ui->mainList->setRootIndex(model->index(s));
                                                        // Удалить все последующие кнопки
                                                        while(vector.last() != b)
                                                        {
                                                            disconnect(vector.last());
                                                            vector.last()->deleteLater();
                                                            vector.removeLast();
                                                        }
                                                    });
                                                
                                                    if(vector.length() > 1) vector[vector.indexOf(b)-1]->setChecked(false);
                                                }
                                                
                                                  Evgenii Legotckoi
                                                  • Jan. 31, 2017, 2:37 p.m.

                                                  Что-то не совсем представляю, как выглядит этот оттиск. Можете приложить скриншот в прикрепление к сообщению?

                                                  И ещё. Делайте лучше отдельные темы по отдельным вопросам.

                                                    Arrow
                                                    • Jan. 31, 2017, 2:55 p.m.

                                                    Буду в другой раз создавать тему.

                                                    Скриншот меню не вышел :), сделал похожий. Круг - это "моя картинка", а рамка - не мое творение.

                                                      Arrow
                                                      • Jan. 31, 2017, 2:58 p.m.

                                                      Скриншот приложить не выходит - форум выбивает ошибку.

                                                        Arrow
                                                        • Jan. 31, 2017, 2:59 p.m.

                                                        0

                                                          Arrow
                                                          • Jan. 31, 2017, 2:59 p.m.

                                                          Получилось :)

                                                            Evgenii Legotckoi
                                                            • Feb. 1, 2017, 1:12 a.m.

                                                            Не уверен, но возможно стоит применить настройку border для QMenu::indicator:non-exclusive:checked

                                                              Arrow
                                                              • Feb. 1, 2017, 3:03 a.m.

                                                              Не помогло. Сделал фото как это выглядит на экране.

                                                                Evgenii Legotckoi
                                                                • Feb. 1, 2017, 8:38 a.m.

                                                                Как вариант, наследовать QMenu и переопределить метод paintEvent и там уже отрисовывать, как хочется. Этот путь конечно посложнее, но гарантирует результат. А насчёт QSS у меня пока мыслей нет.

                                                                  Arrow
                                                                  • Feb. 1, 2017, 8:50 a.m.

                                                                  Немного помудрил с кодом и выяснил, что если убрать следующие строки, то и проблема исчезает, только вместе с картинками :)

                                                                                  "QMenu::indicator:non-exclusive:checked {"
                                                                                  "image: url(:/pict/check.png);"
                                                                                  "}"
                                                                                  "QMenu::indicator:non-exclusive:unchecked {"
                                                                                  "image: url(:/pict/unchecked.png);"
                                                                                  "}";
                                                                  
                                                                  Наследование это хорошо, но проблема насколько я понимаю в назначении картинки.
                                                                    Arrow
                                                                    • Feb. 1, 2017, 8:53 a.m.

                                                                    Вообще если в коде затрагивать indicator, например так:

                                                                                    "QMenu::indicator {"
                                                                                    "width: 12px;"
                                                                                    "height: 12px;"
                                                                                    "}"
                                                                    

                                                                    возникает эта проблема.

                                                                      Evgenii Legotckoi
                                                                      • Feb. 1, 2017, 8:57 a.m.

                                                                      Ну а если применить border к indicator?

                                                                      "QMenu::indicator {"
                                                                      "width: 12px;"
                                                                      "height: 12px;"
                                                                      "border: none;"
                                                                      "}"
                                                                      
                                                                        Arrow
                                                                        • Feb. 1, 2017, 3:34 p.m.

                                                                        "Не действует."

                                                                          Arrow
                                                                          • Feb. 1, 2017, 3:41 p.m.

                                                                          Рабочий вариант:

                                                                          QString StyleHelper::getMenuStyleSheet()
                                                                          {
                                                                              return "QMenu {"
                                                                                          "background-color: #fff;"
                                                                                          "border: none;"
                                                                                          "border-radius: 0px;"
                                                                                          "}"
                                                                                          "QMenu::item {"
                                                                                          "padding-left: 18px;"
                                                                                          "margin: 4px;"
                                                                                          "}"
                                                                                          "QMenu::item:selected {"
                                                                                          "color: #111;"
                                                                                          "background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1,"
                                                                                                  "stop: 0 #fff, stop: 1 #eef);"
                                                                                          "}"
                                                                                          "QMenu::separator {"
                                                                                          "height: .5px;"
                                                                                          "background: #eee;"
                                                                                          "margin-left: 10px;"
                                                                                          "margin-right: 5px;"
                                                                                          "}"
                                                                                          "QMenu::indicator {"
                                                                                          "width: 14px;"
                                                                                          "height: 14px;"
                                                                                          "}"
                                                                                          "QMenu::indicator:non-exclusive:checked {"
                                                                                          "image: url(:/pict/check.png);"
                                                                                          "}"
                                                                                          "QMenu::indicator:non-exclusive:unchecked {"
                                                                                          "image: url(:/pict/unchecked.png);"
                                                                                          "}";
                                                                          }
                                                                          

                                                                          Добавил следующий код:

                                                                                         "QMenu::item {"
                                                                                          "padding-left: 18px;"
                                                                                          "margin: 4px;"
                                                                                          "}"
                                                                          

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

                                                                          Спасибо за помощь, Ваш код с "border: none;" натолкнул на правильную мысль :)

                                                                            Comments

                                                                            Only authorized users can post comments.
                                                                            Please, Log in or Sign up
                                                                            Дмитрий

                                                                            C ++ - Test 004. Pointers, Arrays and Loops

                                                                            • Result:60points,
                                                                            • Rating points-1
                                                                            Дмитрий

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

                                                                            • Result:92points,
                                                                            • Rating points8
                                                                            d
                                                                            • dsfs
                                                                            • April 26, 2024, 2:56 p.m.

                                                                            C ++ - Test 004. Pointers, Arrays and Loops

                                                                            • Result:80points,
                                                                            • Rating points4
                                                                            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
                                                                            G
                                                                            George13May 7, 2024, 10:27 a.m.
                                                                            добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
                                                                            BlinCT
                                                                            BlinCTMay 5, 2024, 3:46 p.m.
                                                                            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                                                            PS
                                                                            Peter SonMay 4, 2024, 3:57 a.m.
                                                                            Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
                                                                            Evgenii Legotckoi
                                                                            Evgenii LegotckoiMay 3, 2024, 12:07 a.m.
                                                                            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                                                                            IscanderChe
                                                                            IscanderCheApril 30, 2024, 2:22 p.m.
                                                                            Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

                                                                            Follow us in social networks