Ответы пользователя по тегу C++
  • Почему программа не работает вне Qt Creator?

    EXL
    @EXL
    Энтузиаст
    Я вижу несколько способов разрешения зависимостей.
    Во-первых, можно собрать libcurl и libjansson статически и прилинковать к вашему приложению.
    Во-вторых, помимо статических libcurl и libjansson можно собрать сам Qt тоже в статику и прилинковать к вашему приложению. На выходе вы получите исполнительный файл большого размера (размер можно урезать с помощью утилиты upx), который будет запускаться во всех современных дистрибутивах GNU/Linux, где есть иксы.
    В-третьих, самый рациональный способ - собрать DEB- или RPM-пакет, в котором в зависимостях прописать пакеты libcurl3(4), libjansson4, и необходимые модули с qt4(5).

    Ну а запустить сам бинарь просто. У вас в Qt Creator'е есть переменная окружения LD_LIBRARY_PATH. Просто скопируйте в терминал её значение перед запуском программы:
    LD_LIBRARY_PATH="/opt/QtSDKs/Qt5.3.1/5.3/gcc_64/lib:/opt/QtSDKs/Qt5.3.1/5.3/gcc_64/lib:/home/user/projects/jansson/lib:$LD_LIBRARY_PATH" ./my_cool_app


    Curl у вас, похоже, собран статически. Попробуйте собрать jansson тоже в статику. Тогда ошибки error while loading shared libraries: libjansson.so.4: cannot open shared object file: No such file or directory вы не получите.
    Ответ написан
    Комментировать
  • Как избавиться от ошибок при компиляции sfml примера?

    EXL
    @EXL
    Энтузиаст
    sudo apt-get install libglew-dev и линковать, как
    g++ -Wall -o "Shader" "Shader.cpp" -lsfml-graphics -lsfml-window -lsfml-system -lGL -lGLEW
    Ответ написан
    Комментировать
  • Как оставить след за движущейся линией QPainter?

    EXL
    @EXL
    Энтузиаст
    Возможно вам следует воспользоваться Qwt - Qt Widgets for Technical Applications.

    Или же посмотреть в сторону QPainterPath.

    mjBUA7j.png

    Там можно рисовать такие вот штуки, посмотрите примеры из документации.
    Ответ написан
    Комментировать
  • Можно, ли на Delphi, или C++ способ отображать цифры на иконке задач Windows?

    EXL
    @EXL
    Энтузиаст
    С использованием фреймворка Qt эта задача становится тривиальной. Во-первых, можно сделать "в лоб" и перерисовывать иконку тогда, когда это нужно:

    MKgjNiO.gif
    Ссылка на исходный код-пример.

    Но правильнее использовать специальные платформозависимые классы для Windows, которые специально предназначены, например, для отображения прогресса на кнопке программы или overlay-иконки, которую можно генерировать собственными силами.

    YjbMHvz.gif
    Ссылка на исходный код-пример.
    Ответ написан
    Комментировать
  • Как в приложении запросить права root`а?

    EXL
    @EXL
    Энтузиаст
    Посмотрите ещё как устроен Qt Installer Framework 1.5.0
    Он запрашивает права root'a (ввод пароля), если пытаешься записать что-то в директорию, недоступную для записи обычному юзеру.
    Ответ написан
    Комментировать
  • Какие книги выбрать по изучению C++?

    EXL
    @EXL
    Энтузиаст
    Комментировать
  • Как подключить Webkit в Qt 5.3.0?

    EXL
    @EXL
    Энтузиаст
    Пробовал подключить различные библиотеки:
    #include
    #include
    Во-первых, а кто вам сказал, что таким образом подключаются библиотеки в C++? Так только подключаются объявления классов и их методов. Библиотеки вы таким образом к проекту не подключите и следовательно получите закономерную ошибку линковки "undefined reference to ...". Это полностью логично, поскольку объявления вы подключили, а их реализацию - нет. Кстати, эти строки вам вообще не нужны, удалите их, они не возымеют должного эффекта, поскольку уже есть в "ui_MainWindow.h", откройте этот файл и изучите его заголовок.

    Во-вторых, вы используете слишком старую документацию, видимо, ещё для Qt 4, хотя пользуетесь Qt 5. Это заметно по:

    http://www.trolltech.com/
    и по:

    #include <QWebView>
    без префикса. Обновите вашу документацию на актуальную или поставьте Qt 4. Qt 5 был разбит на множество частей, Qt 4 более монолитен. Поэтому WebView вынесли в Qt 5 в отдельную библиотеку webkitwidgets.

    В-третьих, сайт www.trolltech.com давно мертв.

    В вашем случае для получения полностью работоспособного приложения следует в *.pro файле определить:

    QT += core gui webkit webkitwidgets
    и убрать:

    #include <QtWebKitWidgets/QWebView>
    #include <QtWebKit>

    Оттуда, куда вы это сами вставили.

    Полностью рабочее приложение, компилирующееся на Qt 5 будет выглядеть как-то так:

    project.pro:
    #-------------------------------------------------
    #
    # Project created by QtCreator 2014-06-09T02:41:10
    #
    #-------------------------------------------------
    
    QT       += core gui webkit webkitwidgets
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = untitled3
    TEMPLATE = app
    
    
    SOURCES += main.cpp\
            MainWindow.cpp
    
    HEADERS  += MainWindow.h
    
    FORMS    += MainWindow.ui

    main.cpp:
    #include "MainWindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }

    mainwindow.h:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    
    private slots:
        void on_pushButton_clicked();
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp:
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        ui->webView->setUrl(QUrl("http://www.habrahabr.ru"));
    }

    Удачи!
    Ответ написан
    Комментировать
  • Почему не компилируется код C++ на Mac OS?

    EXL
    @EXL
    Энтузиаст
    Вы видимо создали один проект и помещаете в него все примеры. Линковщик, видя, что функция main() продублирована несколько раз, выдает вам закономерную ошибку. Типичная ошибка новичка. Вам необходимо перейти на концепцию: для каждого примера - отдельный проект.

    И еще посоветую не использовать кириллические символы в путях к директориям с кодом:
    /Users/Egor/Library/Developer/Xcode/DerivedData/Обучение-flagdgvimqnhjweohxodemobrqre/Build/Intermediates/Обучение.build/Debug/Обучение.build/Objects-normal/x86_64/main.o


    Лучше заменить на
    /Users/Egor/Library/Developer/Xcode/DerivedData/Training-flagdgvimqnhjweohxodemobrqre/Build/Intermediates/Training.build/Debug/Training.build/Objects-normal/x86_64/main.o</build>
    Ответ написан
    Комментировать
  • Оiибка при подключении QDomDocument в Qt

    EXL
    @EXL
    Энтузиаст
    Читайте Assistant и Qt-документацию. Проблему должно исправить добавление строки:

    QT += xml
    В ваш проектный файл "*.pro". Никакой магии тут нет.
    Ответ написан
    2 комментария
  • Как добавить/исправить недостающие заголовки при компиляции ?

    EXL
    @EXL
    Энтузиаст
    Но эффекта ни какого , может нужно внести изменения в makefile ?

    Конечно. Исправлять пути к header'ам в исходниках - плохой тон. В Makefile следует исправлять переменную:

    INCLUDES = -I/usr/local/include/php -I/usr/local/include/php/main ...


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

    CPPFLAGS="-I/usr/include/ -I/usr/include/php" ./configure ...
    Ответ написан
  • Определение максимального среди неповторяющихся элементов матрицы (C++)

    EXL
    @EXL
    Энтузиаст
    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <climits>
    
    void fill_vector(size_t x,
                     size_t y,
                     int range,
                     std::vector< std::vector <int> > &aVector)
    {
        for (size_t i = 0; i < x; ++i) {
            std::vector <int> temp_vector;
            for (size_t j = 0; j < y; ++j) {
                temp_vector.push_back(rand() % range);
            }
            aVector.push_back(temp_vector);
        }
    }
    
    void print_vector(const std::vector< std::vector <int> > &aVector)
    {
        for (size_t i = 0; i < aVector.size(); ++i) {
            for (size_t j = 0; j < aVector.at(0).size(); j++) {
                std::cout << aVector.at(i).at(j) << "\t";
            }
            std::cout << std::endl;
        }
    }
    
    bool unique(int aElem,
                const std::vector <int> &aVector)
    {
        int j = 0;
        for (size_t i = 0; i < aVector.size(); ++i) {
            if (aElem == aVector.at(i)) {
                ++j;
            }
        }
    
        return (j > 1) ? false : true;
    }
    
    int determine_max_elem(const std::vector< std::vector <int> > &aVector)
    {
        int max_elem = INT_MIN;
    
        std::vector <int> temp_vector;
        for (size_t i = 0; i < aVector.size(); ++i) {
            for (size_t j = 0; j < aVector.at(0).size(); j++) {
                temp_vector.push_back(aVector.at(i).at(j));
            }
        }
    
        for (size_t i = 0; i < temp_vector.size(); i++) {
            if (max_elem < temp_vector.at(i) &&
                    unique(temp_vector.at(i), temp_vector)) {
                max_elem = temp_vector.at(i);
            }
        }
    
        return max_elem;
    }
    
    int main()
    {
        std::vector< std::vector <int> > vector;
    
        fill_vector(5, 5, 10, vector); // Fill 2D 5x5 Matrix
        print_vector(vector);
    
        int max = determine_max_elem(vector);
        if (max != INT_MIN) {
            std::cout << "\nMax element is: " << max << std::endl;
        } else {
            std::cout << "\nMax element in matrix isn't found!" << std::endl;
        }
    
        return 0;
    }


    Решение на C++ в лоб, без применения умных алгоритмов.
    Ответ написан
    4 комментария
  • Как разобратся с ошибкой Unsupported protocol в cURL в QtCreator?

    EXL
    @EXL
    Энтузиаст
    https

    Если не ошибаюсь, то cURL должен быть собран с поддержкой этого протокола. То есть тянуть в зависимостях еще и openssl. Проблема в библиотеке cURL. Пробуйте собрать openssl, затем cURL с поддержкой SSL:

    ./configure --with-ssl
    Ответ написан
    5 комментариев
  • Среда разработки C++?

    EXL
    @EXL
    Энтузиаст
    Лично я советую вам Qt Creator - сейчас эта IDE активно поддерживается разработчиками, в отличие от всяких там Code::Blocks и Dev-Cpp.
    Еще можно посмотреть в сторону Eclipse, если не пугает его неповоротливость и объемность.
    Для Hello World'ов и простейших задачек можно пользоваться VIM/GVIM, но он сложен в настройке и не совсем подходит под понятие IDE. Это просто крутой хакерский текстовый редактор.
    Ответ написан
    4 комментария
  • Реализация gui на Windows/Linux без установки сложных библиотек

    EXL
    @EXL
    Энтузиаст
    Есть очень легкий FLTK, но выглядит он, мягко говоря, ужасно.
    Советую вам ориентироваться вот по этому сравнению кросс-платформенных графических тулкитов/фреймворков, который составили разработчики LXDE при переходе с GTK+ на Qt.

    Лично мой выбор - Qt 4.X.X. С помощью статической сборки и утилиты upx возможно получить stand-alone приложение в одном EXE-файле, не зависящее от различных dll'ок.
    Ответ написан
    2 комментария
  • C++ как определить почему падает приложение?

    EXL
    @EXL
    Энтузиаст
    Учитесь пользоваться дебаггером. Для Windows и Ubuntu отлично подойдет дебаггер GDB. Собираете программу с флагом -g, затем загружаете ее в gdb:

    ./gdb programe_name
    В GDB даете команду на запуск (вводите run, нажимаете Enter). Вызываете падение в вашей программе, вводите команду "bt", которая даст вам понять на какой функции упала ваша программа.
    Ответ написан
    1 комментарий
  • QT QFile С++ Как считать из файла числа в массив?

    EXL
    @EXL
    Энтузиаст
    #include <QVector>
    #include <QFile>
    #include <QString>
    #include <QTextStream>
    #include <QStringList>
    
    #include <iostream>
    
    const QString allFileToString(QFile &aFile)
    {
        if (!aFile.open(QFile::ReadOnly | QFile::Text)) {
            std::cout << "Error opening file!" << std::endl;
            return NULL;
        }
        QTextStream in(&aFile);
        return in.readAll();
    }
    
    void setDataToVector(const QStringList &aStringList,
                         QVector< QVector <int> > &aVector)
    {
        size_t x = aStringList.size() - 1; // Count of line, 8
        size_t y = aStringList.at(0).count("\t") + 1; // Count of digits in line, 6
    
        for (size_t i = 0; i < x; ++i) {
            QVector<int> temp_vector;
            for (size_t j = 0; j < y; ++j) {
                temp_vector.push_back(aStringList.at(i).split("\t").at(j).toInt());
            }
            aVector.push_back(temp_vector);
        }
    }
    
    void printVector(const QVector< QVector <int> > &aVector)
    {
        for (int i = 0; i < aVector.size(); ++i) {
            for (int j = 0; j < aVector.at(0).size(); ++j) {
                std::cout << aVector.at(i).at(j) << "\t";
            }
            std::cout << std::endl;
        }
    }
    
    int main(/*int argc, char *argv[]*/)
    {
        QVector< QVector <int> > vector;
        QFile file("test.txt");
    
        setDataToVector(allFileToString(file).split("\n"), vector);
    
        printVector(vector);
    
        return 0;
    }
    Ответ написан
    1 комментарий
  • Подкиньте пару хороших книг по Qt (С++)

    EXL
    @EXL
    Энтузиаст
    1. Бланшет, Саммерфилд - Qt4 Программирование GUI на С++. 2ed. - 2008
    2. Шлее Макс - Профессиональное программирование на C++. +CD. Qt 4.8. (В подлиннике) - 2012
    3. Марк Саммерфилд - Qt Профессиональное программирование (High tech) - 2011
    4. Андрей Боровский - Qt4.7+. Практическое программирование на C++ - 2012
    5. Юрий Земсков - Qt4 на примерах

    Первая книга от создателей Qt, в первых главах рассмотрено создание приложения для работы с таблицами (этакий мини Excel). Так что в прямом смысле за день можно разобраться во всех тонкостях создания подобных приложений.
    Вторая книга от известного в Qt-сообществе программиста, очень подробный и толстый справочник по виджетам, их описание и примеры использования. Имеется несколько глав по JavaScript/QML/QtQuick. Однозначный Must Have.
    Третья книга от одного из программистов, разрабатывающих Qt. В ней рассказано о профессиональной разработке приложений. В чем-то является продолжением первой книги.
    Четвертая книга от отечественного программиста, рассмотрены в основном принципы разработки сложных приложений. Отдельный разделы посвящены программированию трехмерной и интерактивной графики, баз данных, многопоточных приложений и созданию собственных виджетов.
    Пятая книга на мой взгляд уже устарела. Её вполне заменяет Макс Шлее.

    Это все книги по Qt 4.X.X на русском языке, известные мне (не считая редакций). Если кто-то знает ещё, пожалуйста отпишитесь.

    По Qt 5 книг пока нету. Макс Шлее сказал, что начнет работу над новой книгой с выхода версии Qt 5.2. По поводу книг для Qt 5 см. ответ ниже. Но не стоит забывать, что у Qt документация одна из самых лучших и вполне способна заменить книгу. Поэтому настоятельно рекомендую пользоваться Qt Assistant при возникновении затруднений.

    По C++ рекомендую конечно классику:
    Прата С. - Язык программирования С++. Лекции и упражнения - 2011
    Ответ написан
    1 комментарий
  • Перестановка значения Textbox в Visual C++ 2010

    EXL
    @EXL
    Энтузиаст
    Может кто-нибудь направить на путь истинный?

    Наставляю: воспользуйтесь Qt и забудьте про чудовищный WinApi.
    nm9KbJq.png

    Код "main.cpp":
    #include <QApplication>
    #include <QWidget>
    #include <QGridLayout>
    #include <QLabel>
    #include <QLineEdit>
    #include <algorithm>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    public:
        Widget() {
            gridLayout = new QGridLayout(this);
            labelString = new QLabel(tr("String:"));
            labelRevertString = new QLabel(tr("Revert string:"));
    
            lineEdit[0] = new QLineEdit();
            lineEdit[1] = new QLineEdit();
    
            gridLayout->addWidget(labelString, 0, 0);
            gridLayout->addWidget(labelRevertString, 0, 1);
            gridLayout->addWidget(lineEdit[0], 1, 0);
            gridLayout->addWidget(lineEdit[1], 1, 1);
    
            connect(lineEdit[0], SIGNAL(textEdited(QString)),
                    this, SLOT(slotTextChanged(QString)));
            connect(lineEdit[1], SIGNAL(textEdited(QString)),
                    this, SLOT(slotTextChanged(QString)));
        }
        virtual ~Widget() {}
    
    private:
        QGridLayout *gridLayout;
        QLabel *labelString;
        QLabel *labelRevertString;
        QLineEdit *lineEdit[2];
    
    private slots:
        void slotTextChanged(QString aString) {
            std::reverse(aString.begin(), aString.end());
            lineEdit[lineEdit[0]->hasFocus()]->setText(aString);
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget widget;
        widget.setFixedSize(widget.sizeHint());
        widget.show();
        return a.exec();
    }
    
    #include "moc_main.cpp"


    Скачать исполнительный файл
    Ответ написан
    Комментировать
  • MinGW или MSVC: какой компилятор выбрать для приложений на Qt под Windows?

    EXL
    @EXL
    Энтузиаст
    Я за MinGW, хотя бы потому, что он использует собственный Runtime, работающий на ВСЕХ MS Windows OS, начиная с Win95. В случае с Qt - начиная с 2000/XP. Без всяких установок Visual C++ Redistributable/Visual C++ Runtime и дополнительных библиотек. Просто добавляем в проектный файл такие строки: QMAKE_LFLAGS +=-static-libgcc -static-libstdc++
    Ответ написан
    7 комментариев