Страницы

Поиск по вопросам

Показаны сообщения с ярлыком qtcreator. Показать все сообщения
Показаны сообщения с ярлыком qtcreator. Показать все сообщения

понедельник, 24 февраля 2020 г.

Конструктор класса с++, принимающий на вход многомерный initalizer_list

#cpp #qtcreator #g++ #шаблоны_с++


Задался задачей по написанию шаблонного контейнера, который в памяти хранится как
одномерный. При этом со всей необходимой математикой и прочими преобразованиями. Для
начала хотелось написать конструктор, который принимал бы на вход многомерный initalizer_list
(brace-enclosed initializer_list). 

Начал реализацию с этого: 

#ifndef ARRAY_H
#define ARRAY_H

#include 
#include 
#include 

using namespace std;

template 
class array{
private:

    T* data;
    int* shape;

public:

    array(){
        this->data = new T[1]{1};
        this->shape = new int[1]{1};
    }

    template 
    array(initializer_list  input_data){

        const char* TypeName = typeid(input_data).name(); //
        const char* iter = TypeName;                      //
        iter += strlen(TypeName) - 1;                     //
                                                          // Костыльно определяем
размерность
        int dimensionality = 0;                           //
        while (*iter-- == 'E'){                           //
            dimensionality++;                             //
        }                                                 //

        this->shape = new int [dimensionality];
        this->shape[0] = input_data.size();               // Костыльно    заполняем shape

        int input_size = input_data.size();

        this->data = new T [input_data.size()];                                 //
                                                                                //
        const B* item = input_data.begin();                                     //
                                                                                //
        for (int index_data = 0 ; index_data < input_size ; index_data++){      //
Костыльно заполняем data
            this->data[index_data] = *item++;                                   //
        }                                                                       //

    }

    int size(){
        return this->shape[0];
    }

};

#endif // ARRAY_H


При этом интересующий конструктор работает на одномерных объектах, но, при выполнении
следующего кода:

#include 
#include "array.h"

using namespace std;

int main(){

    array  first_test_array;

    cout << "Тест конструктора без аргументов :\n" << first_test_array.size() << endl;

    array  second_test_array {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    cout << "Тест конструктора с одномерным initializer_list :\n" << second_test_array.size()
<< endl << endl;

    array  third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}}; // Падает здесь

    cout << "Тест конструктора с многомерным initializer_list :\n" << third_test_array.size()
<< endl;

}


Пишет вот такую ошибку:

In funstion 'int main()':
/home/artyom/CPP/array/main.cpp:16: ошибка: no matching function for call to 'array::array()'
 array  third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}};
                                                                 ^
/home/artyom/CPP/array/main.cpp:16: candidates are:
/home/artyom/CPP/array/main.cpp:2: In file included from ../array/main.cpp:2:0:
/home/artyom/CPP/array/array.h:25: template array::array(std::initializer_list)
 array(initializer_list  input_data){
 ^

/home/artyom/CPP/array/array.h:25: note:   template argument deduction/substitution
failed:
/home/artyom/CPP/array/main.cpp:16: note:   candidate expects 1 argument, 2 provided
 array  third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}};
                                                                 ^
/home/artyom/CPP/array/main.cpp:2: In file included from ../array/main.cpp:2:0:
/home/artyom/CPP/array/array.h:19: array::array() [with T = int]
 array(){
 ^
/home/artyom/CPP/array/array.h:19: note:   candidate expects 0 arguments, 2 provided
/home/artyom/CPP/array/array.h:11: constexpr array::array(const array&)
class array{
   ^
/home/artyom/CPP/array/array.h:11: note:   candidate expects 1 argument, 2 provided
/home/artyom/CPP/array/array.h:11: constexpr array::array(array&&)
/home/artyom/CPP/array/array.h:11: note:   candidate expects 1 argument, 2 provide


Может ли мне кто-либо объяснить как это сделать?
    


Ответы

Ответ 1



Скорее всего вам поможет: http://christophercrouzet.com/blog/post/2015/01/12/Nested-Initializer-Lists-for-Multidimensional-Arrays Код можно посмотреть тут: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/. Например, реализация вложенного initializer_list: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/nestedinitializerlists.h

Ответ 2



Проблема в том, что в некоторых ситуациях типы не могут быть выведены для шаблонов. И наличие неявного std::initializer_list в передаваемых аргументах одна из таких ситуаций. Выдержка из Стандрарта 14.8.2.5/5: The non-deduced contexts are: ... A function parameter for which the associated argument is an initializer list ([dcl.init.list]) but the parameter does not have a type for which deduction from an initializer list is specified ([temp.deduct.call]). [ Example: template void g(T); g({1,2,3}); // error: no argument deduced for T — end example ] Чтобы Ваш код работал нужно добавить конструктор, принимающий например список списков std::initializer_list> или например список пар std::initializer_list>, если планируется использовать только пары во вложенных списках. Можно ещё явно преобразовать типы при вызове, но это, конечно, не удобно использовать: {std::initializer_list{0, 1}, std::initializer_list{2, 3}}

Ответ 3



У вас конструктор array(initializer_list input_data), следовательно ожидается массив объектов B. Вы же пытаетесь инициализировать его с помощью массива массивов объектов B. Думаю, что вам приедятся определить конструкторarray(initializer_list> input_data)

суббота, 11 января 2020 г.

Как скопировать данные из tableWidget в tableWidget_1?

#cpp #linux #qt #qtcreator


Добрый день, создал программу которая забирает данные из БД и выводит их в qtableWidget_1
в котором выведенные строки можно отметить с помощью Check Box. Рядом есть qtablewidget_2
куда отмеченные строки нужно скопировать, подскажите как такое можно реализовать ?
Сам код вывода запроса из БД.

void MainWindow::on_pushButton_2_clicked()
{

ui->tableWidget->setColumnCount(5); // Указываем число колонок
ui->tableWidget->setShowGrid(true); // Включаем сетку
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); // Разрешаем
выделение только одного элемента
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);// Разрешаем
выделение построчно
//ui->tableWidget->setHorizontalHeaderLabels(headers);// Устанавливаем заголовки колонок
ui->tableWidget->horizontalHeader()->setStretchLastSection(false);// Растягиваем
последнюю колонку на всё доступное пространство
// ui->tableWidget->hideColumn(0);// Скрываем колонку под номером 0
  ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//Запрещаем
редактировать данные в полях таблицы
// Создаём запрос для для выборки записей из базы данных


QSqlQuery query = QSqlQuery(db);
if (!query.exec("SELECT * FROM mytable"))
{
   QMessageBox::information(this,"Окно информации","Не удалось выполнить запрос возможно
нет соеденеия с базой данных.");
   qDebug() << query.lastError().databaseText();
   qDebug() << query.lastError().driverText();
   return;

}else{

/* Выполняем заполнение QTableWidget записями с помощью цикла
 * */
for(int i = 0; query.next(); i++){

    ui->tableWidget->insertRow(i);// Вставляем строку

    /* Устанавливаем в первую колонку id забирая его из результата SQL-запроса
     * Эта колонка будет скрыта
     * */
    ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));


    QTableWidgetItem *item = new QTableWidgetItem();// Создаём элемент, который будет
выполнять роль чекбокса
    item->data(Qt::CheckStateRole);

    /* Проверяем, на статус нечетности, если нечетное устройство, то
     * выставляем состояние чекбокса в Checked, иначе в Unchecked
     * */
    if(query.value(1).toInt() == 1){
        item->setCheckState(Qt::Checked);
    } else {
        item->setCheckState(Qt::Unchecked);
    }

    ui->tableWidget->setItem(i,0, item);// Устанавливаем чекбокс во вторую колонку

    // Забираем все данные из результата запроса и устанавливаем в остальные поля
    ui->tableWidget->setItem(i,1, new QTableWidgetItem(query.value(1).toString()));
    ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString()));
    ui->tableWidget->setItem(i,3, new QTableWidgetItem(query.value(3).toString()));
    ui->tableWidget->setItem(i,4, new QTableWidgetItem(query.value(4).toString()));
    ui->tableWidget->setItem(i,5, new QTableWidgetItem(query.value(5).toString()));


}

ui->tableWidget->resizeColumnsToContents();
db.close();
    }

  }

    


Ответы

Ответ 1



Задача решена: ui->tableWidget_1->setItem(i,1, new QTableWidgetItem(ui->tableWidget->item(i, 1)->text())); как вариант можно использовать так же данную конструкцию ui->tableWidget_1->setItem(i,1, ui->tableWidget->item(i, 1)->clone());

пятница, 10 января 2020 г.

Кросскомпиляция ActiveMQ-cpp

#cpp #qtcreator #cross_compiling #activemq


Нужна подробная инструкция по кросс-компиляции ActiveMQ-cpp на ubuntu 15 64bit для
ARM 32 bit. Компилятор arm-linux-gnueabihf-g++. Что кросскомпилировать прежде (необходимо
и достаточно), с какими флагами? Гоогл дает только отрывочные инструкции.

Пока имею вот это:

Конфигурация для сборки activemq-cpp из исходников:

./configure --prefix=$HOME/usr --with-sysroot=/home/rishat/olimex CXX=/usr/bin/arm-linux-gnueabihf-g++


в результате получаю:

... (много строк)
checking size of wchar_t... configure: error: in `/home/rishat/Source/activemq-cpp-library-3.9.4_arm':
configure: error: cannot compute sizeof (wchar_t)
See `config.log' for more details


Содержимое config.log по этому вопросу:

configure:17217: result: no
configure:17235: checking for wchar_t
configure:17235: /usr/bin/arm-linux-gnueabihf-g++ -c -g -O2  conftest.cpp >&5
configure:17235: $? = 0
configure:17235: /usr/bin/arm-linux-gnueabihf-g++ -c -g -O2  conftest.cpp >&5
conftest.cpp: In function 'int main()':
conftest.cpp:61:14: error: expected primary-expression before 'wchar_t'
 if (sizeof ((wchar_t)))
              ^
conftest.cpp:61:14: error: expected ')' before 'wchar_t'
conftest.cpp:62:14: error: expected ')' before ';' token
      return 0;
              ^
conftest.cpp:62:14: error: expected ')' before ';' token
configure:17235: $? = 1
configure: failed program was:
| /* confdefs.h */


Все необходимые пакеты устанавливал "нормальным" способом:

sudo apt-get install autoconf
sudo apt-get install libtool-bin
sudo apt-get install libcppunit-dev 
sudo apt-get install libapr1-dev


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

Исходники activemq-cpp: http://activemq.apache.org/cms/download.html

Исходники apr: https://apr.apache.org/download.cgi


    


Ответы

Ответ 1



Шаг 1. Кросс-компиляция apr-1: Скачал исходники из https://apr.apache.org/download.cgi Дальше идет описание грязного хака, но без него не получилось Разархивируем в папку apr-1.5.2_local, стандартно компилируем (под локальную машину): ./configure make Внимание, не инсталим! Нам теперь понадобятся файлы из apr-1.5.2_local/tools в дальнейшем (в этом и заключается "грязный хак") Разархивируем снова в папку apr-1.5.2_arm Конфигурю с помощью следующих флагов (если кто найдет более оптимальный набор флагов, напишите коммент): ./configure --prefix=$HOME/arm/usr --with-sysroot=$HOME/olimex --build=x86_64-pc-linux-gnu --host=arm-linux CPPFLAGS=-I$HOME/arm/usr/include LDFLAGS=-L$HOME/arm/usr/lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \ ac_cv_file__dev_zero="yes" \ ac_cv_func_setpgrp_void="yes" \ apr_cv_process_shared_works="yes" \ apr_cv_mutex_robust_shared="no" \ apr_cv_tcp_nodelay_with_cork="yes" \ ac_cv_sizeof_struct_iovec="8" \ apr_cv_mutex_recursive="yes" Копируем файлы из apr-1.5.2_local/tools в apr-1.5.2_arm/tools Пояснение: Дело в том, что в процессе make'а генерируется и выполняется бинарный файл tools/gen_test_char, а на 64-битной машине 32-битная бинарка не распознается и не выполняется. Если кто знает, как обойти это скользкое место, прошу отписаться. Выполняю make со своим набором компиляторов (кажется, тут нужен только си, без плюсов, но не помешал): make CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ sudo make install (заинсталил в $HOME/arm/usr) С помощью этого пока удалось кросскомпилировать ActiveMQ без поддержки openssl следующей конфигурацией: ./configure --prefix=$HOME/arm/usr --with-sysroot=$HOME/olimex --host=arm-linux --with-apr=$HOME/arm/usr CPPFLAGS=-I$HOME/arm/usr/include LDFLAGS=-L$HOME/arm/usr/lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ CFLAGS=-pthread LDFLAGS=-lpthread LDFLAGS=-L$HOME/arm/usr/lib -disable-ssl

суббота, 4 января 2020 г.

Перенос Qt приложения в Linux

#linux #qt #dll #qtcreator


Добрый день.
Тема, наверное, не нова, но вразумительной инструкции так и не нашел. Выбрал Qt,
как инструмент именно кроссплатформенного программирования, для меня это критично.
Пока все во фреймворке устраивает, а вот методология сборки либ и переноса на другие
машины меня разочаровует. Особенно это касается *nix систем. Если в винде достаточно
вручную собрать в папку с бинарником необходимые dll (что само по себе немного напрягает,
неужели создатели такой удобной IDE, как QtCreator не смогли добавить инструмент для
автоматической сборки всего и вся?), то в Linux я совсем запутался, как создать переносимое
приложение без необходимости устанавливать весь пакет Qt на целевой машине? Есть ли
доступные пошаговые инструкции? Может кто своими словами втолкует? В Linux ориентируюсь
на уровне пользователя. 
Или может есть своя "философия" распространения приложений, о которой я не знаю?
Заранее благодарю сообщество.
    


Ответы

Ответ 1



Переносимые приложения в линуксе зло. Все приложения должны устанавливатся пакетным менеджером, который и следит за зависимостями, необходимыми библиотеками. Это позволяет не ставить для каждого приложения копии необходимых библиотек. Это не значит, что Вы не можете его сделать, но нет никакой гарантии, что нужная библиотека будет работать в данном дистрибутиве, которых тысячи. Я думаю, Вам целесообразнее разобратся с автоматизированными системами сборки, как к примеру Ланчпад для убунты http://help.ubuntu.ru/manual/ppa, куда Вы заливаете исходник, а он отдает готовый пакет.

Ответ 2



Для Windows есть утилита winqtdeployment, которая может сложить все явные зависимости в папку с вашей программой. http://doc.qt.io/qt-5/windows-deployment.html

Ответ 3



Обычно в Linux принято не таскать с программой все необходимые библиотеки, а устанавливать их как зависимости. Но в последнее время появились системы сборки, которые позволяют это делать, например snap и flatpak. А еще должна быть возможность прилинковывать нужные библиотеки статически.

Ответ 4



Тебе нужно задеплоить приложение, для этих целий я использую утилиту cqtdeployer Установить можно из релизов github или из snapstore sudo snap install cqtdeployer Пользоваться можно следующим образом : cqtdeployer -bin myApp -qmake path/to/my/qmake -qmlDir path/to/my/qml/files/dir Запускать через sh скрипт Если будите использовать версию из snap то убедитесь что у вас есть все пермишены

Ответ 5



Делал статическую сборку в Windows. Плюс этого варианта - потом не надо каждый раз генерить инсталлятор с библиотеками, на выходе компилятора получаем работающий exe-шник. Для линукса - практически то же самое, можно один раз заморочиться, и потом компилировать портативную пользовательскую программу (если, конечно, не используются ещё другие специфические системные библиотеки)

четверг, 2 января 2020 г.

Как отключить подчёркивание красными волнистыми линиями в Visual Studio для проектов QT?

#cpp #qt5 #qtcreator #visual_studio_2013


Создаю проект qt в Visual Studio.Проект полностью собирается и работает, но раздражают
подчёркивания намекающие на ошибки. Как от этого избавится? 

    


Ответы

Ответ 1



Это происходит из-за того, что IntelliSense не очень хорошо работает в студии и, судя по всему, в этом коде студия считает, что эти символы компилятору не известны. Я бы рекомендовал обновить студию, они постоянно улучшают эту часть. Если же хочется просто отключить подчёркивание, то Вы можете это сделать в Tools->Options->Text Editor->C/C++->Advanced->IntelliSense->Disable Squiggles

Ответ 2



Для того что бы решить эту проблему нужно в настройках проекта в верхнем выпадающем списке Конфигурации выбрать Все конфигурации. Дальше надо зайти в Свойства и конфигурации -> C/C++ и в пункте "Дополнительные каталоги включаем" вручную прописать пути к библиотеке QApplication которая, в моём случае, лежит по пути C:\Qt\Qt5.6.0\5.6\msvc2013_64\include\QtWidgets\5.6.0\QtWidgets. Кому лень читать, можно посмотреть видео. Но там другие пути прописываются, которые в моём случае, проблему не исправили.

Ответ 3



Tools -> Options -> Text Editor -> Font&Colors: find at down and select the "Error" at the "Color Scheme". Click "Copy", "Ok". Select No underline at the Underline section.

суббота, 28 декабря 2019 г.

Как запустить приложение, написанное на Qt C++, на другом ПК, где Qt нету?

#cpp #windows #qt #qtcreator


У меня на моем ПК, все запускается без ошибок. В папку с .exe я положил все нужные
библиотеки. Но на другом ПК пишет, что Qt плагин не найден.


Подскажите пожалуйста, что делать?
    


Ответы

Ответ 1



Вам нужно: собрать релиз использовать программу windeployqt Ее нужно запустить из папки, где лежит .exe вашей программы.

Ответ 2



А если сделать без специализированного ПО, то можно так: Во-первых вот тут есть великолепная инструкция, которой всегда пользуюсь. Во-вторых, если своими словами, как-то так: В версии сборки ставите Release Собираете приложение Копируете Ваш .exe-файл в другое расположение Запускаете Вылазит ошибка о том, что не хватает определённой .dll-библиотеки Ищете нужную виндовым поиском по файлам и подставляете в ту папку, куда Вы скопировали .exe Если вылазит ошибка не связанная с наличием какой-либо библиотеки, копируете все библиотеки из папки с библиотеками Qt (название начинается с Q и расширение .dll) в папку с Вашим проектом, а потом удаляете лишние. Долго, но действенно Когда Ваше приложение, наконец, запустилось и все лишние библиотеки удалены, то, что осталось копируете на любой другой комп без Qt и запускаете.

Ответ 3



Ищите в каталоге установки Qt папку plugins\platforms Копируете из нее qwindows.dll в папку platforms, созданную в каталоге с вашим exe-шником

четверг, 26 декабря 2019 г.

GNU Readline, статическое подключение к Qt

#linux #qt #qtcreator #readline


Имеется Qt Creator с собранным Qt с флагом -static. Библиотеки qt успешно вшиваются
в программу, а вот readline (GNU Readline) никак не желает. Каким образом надо настроить
.pro - файл, чтобы readline вшилась в программу?

ОС: Ubuntu 14.xx. Файл libreadline.a в системе есть. 

P.S.: проект с открытым исходным кодом будет, так что про GNU в курсе.
    


Ответы

Ответ 1



Сразу предупреждаю, на ответ не тянет, но в комментарий не поместится. Собрал тест с readline (но без QT -)). В самом деле gcc -o t-r t-readline.c -static -lreadline выдает предупреждения для некоторых функций libc (связанных с аутентификацией) и ошибки на отсутствие функций tgetent, tputs, tgetflag и т.п., вызываемых из функций библиотеки readline. Понятно, что я не задал линкеру какую-то библиотеку (или несколько). Узнать, какие библиотеки нужны помогает утилита ldd (print shared object dependencies). Итак, собираем shared версию gcc -o t-r t-readline.c -lreadline и запускаем ldd avp@avp-ubu1:hashcode$ ldd -v ./t-r linux-vdso.so.1 => (0x00007ffeb73e5000) libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007fb39dd17000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb39d94d000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fb39d724000) /lib64/ld-linux-x86-64.so.2 (0x00007fb39df5d000) Version information: ./t-r: libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libreadline.so.6: libtinfo.so.5 (NCURSES_TINFO_5.0.19991023) => /lib/x86_64-linux-gnu/libtinfo.so.5 libc.so.6 (GLIBC_2.11) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6: ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libtinfo.so.5: libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 Из полученного вывода делаем предположение, что скорее всего нам нужна libtinfo. Пробуем avp@avp-ubu1:hashcode$ gcc -o t-r t-readline.c -static -lreadline -ltinfo /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f69): warning: Using 'getpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(tilde.o): In function `tilde_expand_word': (.text+0x1c4): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(shell.o): In function `sh_get_home_dir': (.text+0xf9): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f5f): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x4009): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking avp@avp-ubu1:hashcode$ смотрим результат avp@avp-ubu1:hashcode$ file t-r t-r: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e0ee17d4201c7070bf650e9ac2bac441f6628a51, not stripped avp@avp-ubu1:hashcode$ потом слегка "тестируем" avp@avp-ubu1:hashcode$ ./t-r > djjdjj line: djjdjj > kdkk dkkdkk dk line: kdkk dkkdkk dk > kdkk dkkm 49949 dkk dk line: kdkk dkkm 49949 dkk dk > End avp@avp-ubu1:hashcode$ и видим, что затея удалась. P.S. Warnings, наверное, тоже можно побороть.

понедельник, 23 декабря 2019 г.

Включение поддержки стандарта с++11 в Qt

#cpp #qt #qtcreator


Я понимаю, как включить поддержку 11 стандарта С++ в каждом отдельном проекте Qt.
В .pro файле пишем:

CONFIG += C++11


и все работает.

Можно ли настроить Qt Creator, чтобы он автоматически добавлял эту строчку в файл
проекта? Т.е. каждый вновь создаваемый проект должен сразу создаваться с этой опцией.
Гугл как-то не очень помогает...
    


Ответы

Ответ 1



В папке Qt Creator'а есть каталог share\qtcreator\templates\wizards\projects В нём - папки, имя которых соответствует типу создаваемого проекта. Внутри папки лежит файлик file.pro. Этот файл - шаблон для нового проекта.

суббота, 21 декабря 2019 г.

Дублирование имен файлов в проектах С++

#cpp #qtcreator #gdb


Имею проект C++ под qmake с иерархической структурой TEMPLATE=SUBDIRS

Module1
   ModuleStaticLib1
   UnutTest1
Module2
   ModuleStaticLib2
   UnutTest2
Module3
   Приложение


В каждом подпроекте могут быть *.cpp файлы с одинаковыми именами


Module1/ModuleStaticLib1/Controller.cpp - реализация класса namespace Module1::Controller    
UnitTest1/Controller.cpp - юнит тест класса Module1::Controller   
Module2/ModuleStaticLib2/Controller.cpp - реализация Module2::Controller    
UnitTest2/Controller.cpp - юнит тест класса Module2::Controller


Работаю в qtcreator. Обратил внимание на странный баг при отладке, если установить
точку останова в  UnitTest1/Controller.cpp, она ставится также и в Module1/ModuleStaticLib1/Controller.cpp
(может и в другие одноименные файлы, но я гоняю один тест). В рамках одного модуля
имена файлов не повторяются.

Кроме того мой коллега, выразил сомнение в таком подходе, могут быть  проблемы со
сборкой(я не замечал). На сколько корректно использование одинаковых имен в разных
модулях, и чем может быть баг с точками оcтанова qtcreator или GDB?


QtCreator 3.5.81 
gcc version 4.8.4
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Linux Mint17


PS Демонстрация структуры "Глюкодрома" =)

    


Ответы

Ответ 1



По-моему, опция "Set breakpoints using a full absolute path" решает проблему с дублированием точек останова.

Ответ 2



Будет жуткий глюкодром - среда объединяет файлы с равными именами. Но гораздо хуже будет глюкодром в сознании человека, которому вы этой лазанье придется разбираться. Хотя бы из-за этого стоит уйти от такой структуры. UPD от 9 октября 2016. Qt creator в связке с MSVC2012 работает как попало, если в проекте есть одинаковые по именам файлы, он затирает одни объектники (*.obj) другими, более поздними, так как сваливает все в один каталог. В итоге - тонны ошибок при линковке.

среда, 18 декабря 2019 г.

Разные версии модулей в одном проекте

#cpp #qt #qtcreator #qtquick


Есть две версии Qt5:


/home/user/.Qt/ - qt5.6 без webkit&webengine (интернал еррор при сборке)  
/home/user/.Qt/Qt5.5/gnu... полный пак, с установщика.


Возможно ли в одном проекте использовать вебкит\вебенжин (5.5 соответственно) и qtmultimedia-5.6
(Qbs проект)? Либо как-то установить qtmultimedia5.6 как 5.5(пересобрать мб)?
    


Ответы

Ответ 1



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

четверг, 5 декабря 2019 г.

Как увидеть значение своего класса String?

#cpp #visual_studio #отладка #qtcreator


Написал свой класс строки - String. Но увидеть значение переменной типа String в
Visual Studio или Qt Creator не могу (занимаюсь переводом в std::string). 

Как заставить IDE показывать значение таких переменных?
    


Ответы

Ответ 1



Смотрите. Для свежих версий Visual Studio (начиная с 2012) лучше всего пользоваться форматом natvis. При этом вы можете, например, включить визуализацию ваших типов прямо в проект, и Visual Studio даже будет подхватывать изменения отображения прямо на лету, во время отладки. Давайте разберём простой пример. Создадим простейший кастомный класс, представляющий строку. #include "stdafx.h" #include namespace utils { class MyString { size_t length; char* payload; public: MyString() : length(0), payload(nullptr) { } MyString(char* data) : length(strlen(data)), payload(new char[length + 1]) { strcpy_s(payload, length + 1, data); } ~MyString() { delete[] payload; } }; } И простейший тест: int main() { utils::MyString s1; utils::MyString s2("I am string"); } Теперь добавим нашу кастомную визуализацию. Для этого идём в окно проекта и добавляем новый natvis-файл. Назовём его MyString.natvis. Получим следующий файл: Добавим в него нашу визуализацию. Положим тег Type с именем нашего типа (включая namespace). Подтег DisplayString задаёт то, как тип будет отображаться в одну строку. Можно добавить условие (DisplayString Condition=), в зависимости от которого значение будет отображаться по-другому. Подтег Expand управляет тем, как будут отображаться данные в «распахнутом» виде. (Поскольку это XML, не забудьте, что < и > для шаблонных типов придётся вводить как < и >, наподобие Name="std::vector<*>". Звёздочка используется для обозначения произвольного аргумента шаблона.) [empty string] {payload,s}, len={length,d} length,d payload, sb Получаем вот такую картинку в окошке Watch: Дополнительное чтение по теме: Подробная информация о синтаксисе natvis и его фичах находится здесь. Обзор новых возможностей natvis в Visual Studio 2015 здесь.

среда, 17 июля 2019 г.

Не могу собрать и запустить qt проект

Скачал я qt и Qt,и решил поизучать,посмотреть.
Так как c++ не очень хорошо знаю а опыта не очень,то прошу о помощи. При создании проекта я обратил внимание на это в основных сообщениях:
Выполняется поиск устройств WinRT. C:/Qt/Qt5.11.0/5.11.0/winrt_armv7_msvc2015/bin/winrtrunner.exe --list- devices Обнаружено 1 устройство WinRT. Project ERROR: Cannot run compiler 'cl'. Output: =================== =================== Maybe you forgot to setup the environment? Ошибка разбора файла C:\Users\timax\Documents\Test1\Test1.pro. Отмена.
И проект не запускается.
Покопавшись я обнаружил, что есть Desktop Qt 1.11.0 MSVC2015 32bit и Desktop Qt 1.11.0 MSVC2015 64bit и пишет "Ошибка: у комплекта не задан компилятор" Как это исправить?


Ответ

Надо было просто поэксперементировать с компиляторами.
В настройках для каждой MSVC надо было указать определенный компилятор
(у меня были не те).

суббота, 6 июля 2019 г.

Отобразить в QLabel определенный кусок QPixmap

Делаю анимацию, по таймеру меняется кадр, анимация состоит из 1-й картинки, в которой нарисован каждый кадр.
Как можно поместить в QLabel определенный фрагмент QPixmap?
P.s. Если QPixmap или QLabel не поддерживают такое, то что можно использовать для такого вида анимации?


Ответ

Вам нужен метод QPixmap::copy(int x, int y, int width, int height), который вернет вам QPixmap-копию по координатам, определенных во входных параметрах.

понедельник, 17 июня 2019 г.

Ошибка: multiple definition of в QWidget

Есть *.h файл со следующим кодом:
#ifndef CORECOMMANDS_H #define CORECOMMANDS_H #pragma once #include #include
struct MassageDataIn{ QString operationId; QStringList names; QStringList values; };
//Запрос базовых параметров ядра const MassageDataIn cmdSetupRequest(){ MassageDataIn massageData; massageData.operationId = "12"; return massageData; } //Запрос состояния ядра const MassageDataIn cmdSync(){ MassageDataIn massageData; massageData.operationId = "11"; return massageData; }
Данный файл писался в консольном приложении и работал без всяких ошибок. После создания консольного приложение возникла надобность использования его в уже в QWidget приложении. При попытке скомпилировать проект на начальной стадии (только создал стандартный проект QWidget и подключил этот и еще несколько файлов, предварительно скопировав его с консольного проекта) получаю ошибку:
14: ошибка: multiple definition of 'cmdSetupRequest()' UI\corecommands.h:14: first defined here UI\debug\core.o:-1: In function `Z7cmdSyncv':
На форуме вычитал, что добавление inline и extern решают данную проблему и это действительно так. НО! Почему в консольном приложении можно обойтись без них, а в QWidget нет? Если все таки можно исправить эти ошибки без добавления inline и extern то как это можно сделать.
p.s. pragma once стоит во всех *.h файлах


Ответ

Определение не inline функций должно быть в файле реализации, т.е. *.cpp. Когда заголовочный файл подключается к разным файлам реализации, получается, что разные модули имеют в своём составе одинаковые функции. Линкеру плохеет и он говорит ошибку типа этой:
multiple definition of `cmdSetupRequest()'
Ну и не хватает #endif в Вашем файле. Да и одновременное использовать разные include-guard как-то через чур всё же.

четверг, 2 мая 2019 г.

Конструктор класса с++, принимающий на вход многомерный initalizer_list

Задался задачей по написанию шаблонного контейнера, который в памяти хранится как одномерный. При этом со всей необходимой математикой и прочими преобразованиями. Для начала хотелось написать конструктор, который принимал бы на вход многомерный initalizer_list (brace-enclosed initializer_list).
Начал реализацию с этого:
#ifndef ARRAY_H #define ARRAY_H
#include #include #include
using namespace std;
template class array{ private:
T* data; int* shape;
public:
array(){ this->data = new T[1]{1}; this->shape = new int[1]{1}; }
template array(initializer_list input_data){
const char* TypeName = typeid(input_data).name(); // const char* iter = TypeName; // iter += strlen(TypeName) - 1; // // Костыльно определяем размерность int dimensionality = 0; // while (*iter-- == 'E'){ // dimensionality++; // } //
this->shape = new int [dimensionality]; this->shape[0] = input_data.size(); // Костыльно заполняем shape
int input_size = input_data.size();
this->data = new T [input_data.size()]; // // const B* item = input_data.begin(); // // for (int index_data = 0 ; index_data < input_size ; index_data++){ // Костыльно заполняем data this->data[index_data] = *item++; // } //
}
int size(){ return this->shape[0]; }
};
#endif // ARRAY_H
При этом интересующий конструктор работает на одномерных объектах, но, при выполнении следующего кода:
#include #include "array.h"
using namespace std;
int main(){
array first_test_array;
cout << "Тест конструктора без аргументов :
" << first_test_array.size() << endl;
array second_test_array {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
cout << "Тест конструктора с одномерным initializer_list :
" << second_test_array.size() << endl << endl;
array third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}}; // Падает здесь
cout << "Тест конструктора с многомерным initializer_list :
" << third_test_array.size() << endl;
}
Пишет вот такую ошибку:
In funstion 'int main()': /home/artyom/CPP/array/main.cpp:16: ошибка: no matching function for call to 'array::array()' array third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}}; ^ /home/artyom/CPP/array/main.cpp:16: candidates are: /home/artyom/CPP/array/main.cpp:2: In file included from ../array/main.cpp:2:0: /home/artyom/CPP/array/array.h:25: template array::array(std::initializer_list) array(initializer_list input_data){ ^
/home/artyom/CPP/array/array.h:25: note: template argument deduction/substitution failed: /home/artyom/CPP/array/main.cpp:16: note: candidate expects 1 argument, 2 provided array third_test_array {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}}; ^ /home/artyom/CPP/array/main.cpp:2: In file included from ../array/main.cpp:2:0: /home/artyom/CPP/array/array.h:19: array::array() [with T = int] array(){ ^ /home/artyom/CPP/array/array.h:19: note: candidate expects 0 arguments, 2 provided /home/artyom/CPP/array/array.h:11: constexpr array::array(const array&) class array{ ^ /home/artyom/CPP/array/array.h:11: note: candidate expects 1 argument, 2 provided /home/artyom/CPP/array/array.h:11: constexpr array::array(array&&) /home/artyom/CPP/array/array.h:11: note: candidate expects 1 argument, 2 provide
Может ли мне кто-либо объяснить как это сделать?


Ответ

Скорее всего вам поможет: http://christophercrouzet.com/blog/post/2015/01/12/Nested-Initializer-Lists-for-Multidimensional-Arrays
Код можно посмотреть тут: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/. Например, реализация вложенного initializer_list: https://github.com/christophercrouzet/m3ta/blob/master/src/m3ta/nestedinitializerlists.h

понедельник, 4 марта 2019 г.

Как скопировать данные из tableWidget в tableWidget_1?

Добрый день, создал программу которая забирает данные из БД и выводит их в qtableWidget_1 в котором выведенные строки можно отметить с помощью Check Box. Рядом есть qtablewidget_2 куда отмеченные строки нужно скопировать, подскажите как такое можно реализовать ? Сам код вывода запроса из БД.
void MainWindow::on_pushButton_2_clicked() {
ui->tableWidget->setColumnCount(5); // Указываем число колонок ui->tableWidget->setShowGrid(true); // Включаем сетку ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); // Разрешаем выделение только одного элемента ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);// Разрешаем выделение построчно //ui->tableWidget->setHorizontalHeaderLabels(headers);// Устанавливаем заголовки колонок ui->tableWidget->horizontalHeader()->setStretchLastSection(false);// Растягиваем последнюю колонку на всё доступное пространство // ui->tableWidget->hideColumn(0);// Скрываем колонку под номером 0 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//Запрещаем редактировать данные в полях таблицы // Создаём запрос для для выборки записей из базы данных
QSqlQuery query = QSqlQuery(db); if (!query.exec("SELECT * FROM mytable")) { QMessageBox::information(this,"Окно информации","Не удалось выполнить запрос возможно нет соеденеия с базой данных."); qDebug() << query.lastError().databaseText(); qDebug() << query.lastError().driverText(); return;
}else{
/* Выполняем заполнение QTableWidget записями с помощью цикла * */ for(int i = 0; query.next(); i++){
ui->tableWidget->insertRow(i);// Вставляем строку
/* Устанавливаем в первую колонку id забирая его из результата SQL-запроса * Эта колонка будет скрыта * */ ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));
QTableWidgetItem *item = new QTableWidgetItem();// Создаём элемент, который будет выполнять роль чекбокса item->data(Qt::CheckStateRole);
/* Проверяем, на статус нечетности, если нечетное устройство, то * выставляем состояние чекбокса в Checked, иначе в Unchecked * */ if(query.value(1).toInt() == 1){ item->setCheckState(Qt::Checked); } else { item->setCheckState(Qt::Unchecked); }
ui->tableWidget->setItem(i,0, item);// Устанавливаем чекбокс во вторую колонку
// Забираем все данные из результата запроса и устанавливаем в остальные поля ui->tableWidget->setItem(i,1, new QTableWidgetItem(query.value(1).toString())); ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString())); ui->tableWidget->setItem(i,3, new QTableWidgetItem(query.value(3).toString())); ui->tableWidget->setItem(i,4, new QTableWidgetItem(query.value(4).toString())); ui->tableWidget->setItem(i,5, new QTableWidgetItem(query.value(5).toString()));
}
ui->tableWidget->resizeColumnsToContents(); db.close(); }
}


Ответ

Задача решена:
ui->tableWidget_1->setItem(i,1, new QTableWidgetItem(ui->tableWidget->item(i, 1)->text()));
как вариант можно использовать так же данную конструкцию
ui->tableWidget_1->setItem(i,1, ui->tableWidget->item(i, 1)->clone());

пятница, 11 января 2019 г.

Как отключить подчёркивание красными волнистыми линиями в Visual Studio для проектов QT?

Создаю проект qt в Visual Studio.Проект полностью собирается и работает, но раздражают подчёркивания намекающие на ошибки. Как от этого избавится?


Ответ

Для того что бы решить эту проблему нужно в настройках проекта в верхнем выпадающем списке Конфигурации выбрать Все конфигурации. Дальше надо зайти в Свойства и конфигурации -> C/C++ и в пункте "Дополнительные каталоги включаем" вручную прописать пути к библиотеке QApplication которая, в моём случае, лежит по пути C:\Qt\Qt5.6.0\5.6\msvc2013_64\include\QtWidgets\5.6.0\QtWidgets.
Кому лень читать, можно посмотреть видео. Но там другие пути прописываются, которые в моём случае, проблему не исправили.

пятница, 30 ноября 2018 г.

GNU Readline, статическое подключение к Qt

Имеется Qt Creator с собранным Qt с флагом -static. Библиотеки qt успешно вшиваются в программу, а вот readline (GNU Readline) никак не желает. Каким образом надо настроить .pro - файл, чтобы readline вшилась в программу?
ОС: Ubuntu 14.xx. Файл libreadline.a в системе есть.
P.S.: проект с открытым исходным кодом будет, так что про GNU в курсе.


Ответ

Сразу предупреждаю, на ответ не тянет, но в комментарий не поместится.
Собрал тест с readline (но без QT -)).
В самом деле
gcc -o t-r t-readline.c -static -lreadline
выдает предупреждения для некоторых функций libc (связанных с аутентификацией) и ошибки на отсутствие функций tgetent, tputs, tgetflag и т.п., вызываемых из функций библиотеки readline
Понятно, что я не задал линкеру какую-то библиотеку (или несколько).
Узнать, какие библиотеки нужны помогает утилита ldd (print shared object dependencies).
Итак, собираем shared версию
gcc -o t-r t-readline.c -lreadline
и запускаем ldd
avp@avp-ubu1:hashcode$ ldd -v ./t-r linux-vdso.so.1 => (0x00007ffeb73e5000) libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007fb39dd17000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb39d94d000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fb39d724000) /lib64/ld-linux-x86-64.so.2 (0x00007fb39df5d000)
Version information: ./t-r: libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libreadline.so.6: libtinfo.so.5 (NCURSES_TINFO_5.0.19991023) => /lib/x86_64-linux-gnu/libtinfo.so.5 libc.so.6 (GLIBC_2.11) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6: ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libtinfo.so.5: libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6 libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
Из полученного вывода делаем предположение, что скорее всего нам нужна libtinfo
Пробуем
avp@avp-ubu1:hashcode$ gcc -o t-r t-readline.c -static -lreadline -ltinfo /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f69): warning: Using 'getpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(tilde.o): In function `tilde_expand_word': (.text+0x1c4): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(shell.o): In function `sh_get_home_dir': (.text+0xf9): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x3f5f): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libreadline.a(complete.o): In function `rl_username_completion_function': (.text+0x4009): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking avp@avp-ubu1:hashcode$
смотрим результат
avp@avp-ubu1:hashcode$ file t-r t-r: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e0ee17d4201c7070bf650e9ac2bac441f6628a51, not stripped avp@avp-ubu1:hashcode$
потом слегка "тестируем"
avp@avp-ubu1:hashcode$ ./t-r > djjdjj line: djjdjj > kdkk dkkdkk dk line: kdkk dkkdkk dk > kdkk dkkm 49949 dkk dk line: kdkk dkkm 49949 dkk dk > End avp@avp-ubu1:hashcode$
и видим, что затея удалась.
P.S. Warnings, наверное, тоже можно побороть.

среда, 21 ноября 2018 г.

Включение поддержки стандарта с++11 в Qt

Я понимаю, как включить поддержку 11 стандарта С++ в каждом отдельном проекте Qt. В .pro файле пишем:
CONFIG += C++11
и все работает.
Можно ли настроить Qt Creator, чтобы он автоматически добавлял эту строчку в файл проекта? Т.е. каждый вновь создаваемый проект должен сразу создаваться с этой опцией. Гугл как-то не очень помогает...


Ответ

В папке Qt Creator'а есть каталог
share\qtcreator\templates\wizards\projects
В нём - папки, имя которых соответствует типу создаваемого проекта. Внутри папки лежит файлик file.pro. Этот файл - шаблон для нового проекта.

пятница, 9 ноября 2018 г.

Дублирование имен файлов в проектах С++

Имею проект C++ под qmake с иерархической структурой TEMPLATE=SUBDIRS
Module1 ModuleStaticLib1 UnutTest1 Module2 ModuleStaticLib2 UnutTest2 Module3 Приложение
В каждом подпроекте могут быть *.cpp файлы с одинаковыми именами
Module1/ModuleStaticLib1/Controller.cpp - реализация класса namespace Module1::Controller UnitTest1/Controller.cpp - юнит тест класса Module1::Controller Module2/ModuleStaticLib2/Controller.cpp - реализация Module2::Controller UnitTest2/Controller.cpp - юнит тест класса Module2::Controller
Работаю в qtcreator. Обратил внимание на странный баг при отладке, если установить точку останова в UnitTest1/Controller.cpp, она ставится также и в Module1/ModuleStaticLib1/Controller.cpp (может и в другие одноименные файлы, но я гоняю один тест). В рамках одного модуля имена файлов не повторяются.
Кроме того мой коллега, выразил сомнение в таком подходе, могут быть проблемы со сборкой(я не замечал). На сколько корректно использование одинаковых имен в разных модулях, и чем может быть баг с точками оcтанова qtcreator или GDB?
QtCreator 3.5.81 gcc version 4.8.4 GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 Linux Mint17
PS Демонстрация структуры "Глюкодрома" =)


Ответ

По-моему, опция "Set breakpoints using a full absolute path" решает проблему с дублированием точек останова.