• Подключение OGRE3D к QT

    EXL
    @EXL
    Энтузиаст
    Недостаточно информации.
    Вы хотите использовать контекст Ogre3D в Qt-приложении? Или же вы хотите просто использовать интегрированную среду разработки Qt Creator для написания программ с помощью Ogre3D SDK и без какого-либо использования самого Qt?

    Насчет crash'а - скорее всего у библиотек из Ogre3D SDK, которые вы скачали, и объектников вашего приложения разный ABI, отсюда и падение. Например, библиотеки Ogre3D SDK собраны с помощью MinGW 4.6.2, а у вы компилируете программу компилятором, идущим с Qt 5.3.0, то есть с помощью MinGW-w64 4.8.2. При линковке никаких предупреждений не будет, но программа не запустится.
    Ответ написан
  • Реализация 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 комментарий
  • Сборка qwt и qwtpolar под Windows

    EXL
    @EXL
    Энтузиаст
    @al31415
    В исходниках qwtpolar есть файл INSTALL, прочитав который я разобрался в компиляции этой библиотеки.
    Моя конфигурация:
    Qt 5.2.1, MinGW 4.8.0
    Qwt-6.1.0 (qwt-6.1.0.tar.bz2)
    Qwtpolar-1.1.0 (qwtpolar-1.1.0.tar.bz2)

    Я распаковал "qwt-6.1.0.tar.bz2" в каталог "C:\Qt\Build", затем поправил файл "qwtconfig.pri" следующим образом:

    diff -Naur qwt-6.1.0/qwtconfig.pri qwt-6.1.0_m/qwtconfig.pri
    --- qwt-6.1.0/qwtconfig.pri	Thu May 30 22:18:27 2013
    +++ qwt-6.1.0_m/qwtconfig.pri	Sun May 25 00:49:50 2014
    @@ -23,7 +23,7 @@
     }
     
     win32 {
    -    QWT_INSTALL_PREFIX    = C:/Qwt-$$QWT_VERSION
    +    QWT_INSTALL_PREFIX    = C:/Qt/Qwt-$$QWT_VERSION
     }
     
     QWT_INSTALL_DOCS      = $${QWT_INSTALL_PREFIX}/doc

    После исправления запустил из меню "Пуск" (Qt 5.2.1->5.2.1->MinGW 4.8 (32-bit)->Qt 5.2.1 for Desktop (MinGW 4.8 32 bit)) командную строку с необходимыми для компиляции переменными окружения, перешел в командной строке в каталог "C:\Qt\Build\qwt-6.1.0", собрал библиотеку qwt и затем установил:

    qmake qwt.pro
    mingw32-make -j3
    mingw32-make install

    После успешной сборки qwt, распаковал архив "qwtpolar-1.1.0.tar.bz2" в каталог "C:\Qt\Build", затем поправил файл "qwtpolarconfig.pri" следующим образом:

    diff -Naur qwtpolar-1.1.0/qwtpolarconfig.pri qwtpolar-1.1.0_m/qwtpolarconfig.pri
    --- qwtpolar-1.1.0/qwtpolarconfig.pri	Fri Jan 31 15:23:39 2014
    +++ qwtpolar-1.1.0_m/qwtpolarconfig.pri	Sun May 25 01:06:57 2014
    @@ -20,7 +20,7 @@
     }
     
     win32 {
    -    QWT_POLAR_INSTALL_PREFIX    = C:/QwtPolar-$$QWT_POLAR_VERSION
    +    QWT_POLAR_INSTALL_PREFIX    = C:/Qt/QwtPolar-$$QWT_POLAR_VERSION
     }
     
     QWT_POLAR_INSTALL_DOCS      = $${QWT_POLAR_INSTALL_PREFIX}/doc

    Потом в командной строке перешел в каталог "C:\Qt\Build\qwtpolar-1.1.0" и приступил к сборке:

    qmake -set QMAKEFEATURES "c:/Qt/Qwt-6.1.0/features"
    qmake qwtpolar.pro
    mingw32-make -j3
    mingw32-make install

    У меня все нормально скомпилировалось и установилось. Патчи не применял, по статье не действовал, возможно она банально устарела. Если будут вопросы - задавайте. Как я понял для нормальной компиляции вам просто следует выполнить:

    qmake -set QMAKEFEATURES "f:/Qt/Qwt-6.1.0/features"

    Перед построением библиотеки.
    Ответ написан
  • Elementary OS на vmware player не во весь экран. В чем проблема?

    EXL
    @EXL
    Энтузиаст
    Нужно скачать и установить VMWare Tools в гостевой машине.
    Ответ написан
    3 комментария
  • 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
    Энтузиаст
    void ScriptWidget::onSaveButtonClick()
    {
        QFile updateScriptFile("update-script");
        if (!updateScriptFile.open(QFile::WriteOnly | QFile::Text)) {
            QMessageBox::critical(this, tr("I/O Error"), tr("Error opening file %1\n"
                                                            "Error: %2")
                                  .arg(updateScriptFile.fileName())
                                  .arg(updateScriptFile.errorString()));
            return;
        }
    
        QTextStream out(&updateScriptFile);
        out << ui->textEdit->toPlainText(); // Get text from the QTextEdit Widget
        updateScriptFile.close();
        emit signalSendMessageToStatusBar(QString(tr("File Saved.")));
    }


    Я так записываю, вроде все работает.
    Используй документацию и Assistant.
    Ответ написан
    Комментировать
  • Подкиньте пару хороших книг по 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"


    Скачать исполнительный файл
    Ответ написан
    Комментировать
  • Кросс-компиляция программ?

    EXL
    @EXL
    Энтузиаст
    Все программы, использующие SDL или Qt. Например:
    Qt Creator
    PPSSPP
    Otter Browser (аналог браузера Opera 12)
    Clementine
    CoolReader3
    qBittorrent

    Если ресурсы позволяют в список можно добавить Firefox и Thunderbird.
    Ответ написан
    Комментировать
  • 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 комментариев
  • Какие существуют хорошие библиотеки для работы со звуков в VS С++?

    EXL
    @EXL
    Энтузиаст
    Посоветую кросс-платформенный SDL, и его расширение - SDL_mixer.
    Ответ написан
    Комментировать
  • Какой есть хороший курс лекций по C++?

    EXL
    @EXL
    Энтузиаст
    Вам прямо курс лекций?
    Возможно, это то, что вы ищете:
    www.lektorium.tv/course/22825
    www.lektorium.tv/course/22858
    Ответ написан
  • Linux - Как записать строку в другой кодировке в объект string в c++?

    EXL
    @EXL
    Энтузиаст
    Попробуйте привести строки к одной общей кодировке, а затем сравнить. Для этого можно воспользоваться библиотекой libiconv:

    main.cpp:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    
    using namespace std;
    
    #include <iconv.h>
    
    string iconv_recode(const string from, const string to, string text)
    {
        iconv_t cnv = iconv_open(to.c_str(), from.c_str());
    
        if (cnv == (iconv_t) - 1) {
            iconv_close(cnv);
            return "";
        }
    
        char *outbuf;
        if ((outbuf = (char *) malloc(text.length()*2 + 1)) == NULL) {
            iconv_close(cnv);
            return "";
        }
    
        char *ip = (char *) text.c_str(), *op = outbuf;
        size_t icount = text.length(), ocount = text.length()*2;
    
        if (iconv(cnv, &ip, &icount, &op, &ocount) != (size_t) - 1) {
            outbuf[text.length()*2 - ocount] = '\0';
            text = outbuf;
        } else {
            text = "";
        }
    
        free(outbuf);
        iconv_close(cnv);
    
        return text;
    }
    
    void compare_strings(const string &aString1, const string &aString2) {
    
        cout << "String 1: " << aString1 << endl
             << "String 2: " << aString2 << endl;
    
        if (aString1 == aString2) {
            cout << "Identical strings!" << endl
                 << "-----" << endl;
        } else {
            cout << "Different strings!" << endl
                 << "-----" << endl;
        }
    }
    
    int main()
    {
        ifstream file_1("word_1.txt");  // The "Proverka" Word in UTF-8
        ifstream file_2("word_2.txt");  // The "Proverka" Word in CP1251
        string word_1, word_2;
    
        file_1 >> word_1;
        file_2 >> word_2;
    
        compare_strings(word_1, word_2);
    
        word_2 = iconv_recode("CP1251", "UTF-8", word_2);
    
        compare_strings(word_1, word_2);
    
        return 0;
    }


    exl@exl-Lenovo-G560e:~/SandBox/text_enc > enca -L russian  word_1.txt 
    Universal transformation format 8 bits; UTF-8
      Doubly-encoded to UTF-8 from ISO-8859-5
    exl@exl-Lenovo-G560e:~/SandBox/text_enc > enca -L russian  word_2.txt 
    MS-Windows code page 1251
      LF line terminators
    exl@exl-Lenovo-G560e:~/SandBox/text_enc > cat word_1.txt 
    Проверка 
    exl@exl-Lenovo-G560e:~/SandBox/text_enc > cat word_2.txt 
    ��������
    exl@exl-Lenovo-G560e:~/SandBox/text_enc > ./text_coding 
    String 1: Проверка
    String 2: ��������
    Different strings!
    -----
    String 1: Проверка
    String 2: Проверка
    Identical strings!
    -----
    Ответ написан
    1 комментарий
  • Анимация в виджете qt на qpainter - как поставить паузу?

    EXL
    @EXL
    Энтузиаст
    Вы неправильно рисуете. Попробуйте так:

    qpaintwidget.cpp:
    #include "qpaintwidget.h"
    
    #include <QPainter>
    #include <QDebug>
    
    QPaintWidget::QPaintWidget(QWidget *parent)
        : QWidget(parent)
    {
        offset = 0;
        resize(800, 600);
    
        paintTimer = new QTimer(this);
        paintTimer->start(10);
        connect(paintTimer, SIGNAL(timeout()), this, SLOT(updatePixmap()));
    }
    
    void QPaintWidget::paintEvent(QPaintEvent *)
    {
        QColor whitebrush = Qt::white;
        QColor blackbrush = Qt::black;
        QColor redbrush = Qt::darkRed;
        QPainterPath path;
        QPainter painter(this); // Создаём новый объект рисовальщика
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(Qt::NoPen);
        painter.translate(1 + offset, 0);
        painter.setBrush(whitebrush);
        painter.drawRect(0, 0, width(), height());
        QPoint triangle[3] = {
            QPoint(180, 450),
            QPoint(220, 450),
            QPoint(200, 555),
        };
        painter.setBrush(blackbrush);
        painter.drawEllipse(10, 15, 380, 380);
        painter.setBrush(redbrush);
        painter.drawEllipse(35, 8, 330, 330);
        painter.setBrush(whitebrush);
        painter.drawEllipse(50, -5, 300, 330);
        painter.setBrush(blackbrush);
        painter.drawPolygon(triangle, 3);
        path.setFillRule(Qt::WindingFill);
        path.addRect(180, 250, 40, 200);
        path.addRect(150, 250, 100, 20);
        painter.drawPath(path);
        painter.setBrush(whitebrush);
        painter.drawEllipse(120, 260, 60, 20);
        painter.drawEllipse(220, 260, 60, 20);
    }
    
    void QPaintWidget::updatePixmap()
    {
        (offset >= 810) ? offset = 0 : offset+=5;
        qDebug() << offset;
        repaint();
    }
    
    QPaintWidget::~QPaintWidget()
    {
    
    }


    qpaintwidget.h:
    #ifndef QPAINTWIDGET_H
    #define QPAINTWIDGET_H
    
    #include <QWidget>
    #include <QTimer>
    
    class QPaintWidget : public QWidget
    {
        Q_OBJECT
    
        int offset;
        QTimer *paintTimer;
    protected:
        void paintEvent(QPaintEvent *);
    private slots:
        void updatePixmap();
    public:
        QPaintWidget(QWidget *parent = 0);
        ~QPaintWidget();
    };
    
    #endif // QPAINTWIDGET_H


    И несколько советов:
    1. Во-первых, никогда не используйте sleep() или Sleep() (в Windows) в программах на Qt. Так как при вызове этой функции замораживается основной thread, в котором как раз и происходит рендеринг GUI. Отсюда тормоза программы и пр.

    2. Никогда не начинайте названия своих классов с буквы Q или q, так как тогда их легко спутать с теми классами, которые входят в библиотеку. Если вам так нужен префикс в имени класса, используйте заглавную C (Class), т. е. ваш класс должен иметь название CPaintWidget или просто PaintWidget.
    Ответ написан
  • Какие язык, компилятор, среда подойдут для разработки небольшого приложения под windows?

    EXL
    @EXL
    Энтузиаст
    Qt 4.8.5 собранный статически;
    MinGW 4.4+;
    upx.

    Вся эта связка поможет вам собрать полностью абстрагированное от внешних библиотек приложение в одном exe-файле, размером ~3-5 MB. Запускаться которое будет везде (от XP до 8, x32, x64) и даже в Wine. + Можно будет перекомпилировать приложение под GNU/Linux и MacOS и оно будет выглядеть там нативно.

    Если что, пишите мне на почту (контакты в профиле), я поделюсь с вами статически собранным Qt'ом (на официальном сайте используется версия с динамическими библиотеками) + расскажу и покажу, как сделать подобное приложение. Фреймворк Qt вам понравится, это точно! ^_^
    Ответ написан
    Комментировать
  • Чем отличается запуск без отладки от запуска с отладкой?

    EXL
    @EXL
    Энтузиаст
    Во-первых, компилятор всегда указывает на ошибки и неоднозначности.
    Во-вторых, не запуск с отладкой, а компиляция с отладочными символами.
    В режиме отладки в собранный исполнительный бинарник добавляются специальные символы, позволяющие посмотреть, в какой функции программа завершилась аварийно. Отладочный бинарник позволяет пройти по стеку вызовов функций, выполнить каждую инструкцию процессора или C/C++-строчку по-порядку. Поставить брекпойнт и.т.д.
    Подробнее тут
    Ответ написан
    1 комментарий
  • Как посмотреть машинный код?

    EXL
    @EXL
    Энтузиаст
    Любой хексовый редактор поможет вам увидеть изображение так, как оно представлено в памяти компьютера.
    хочу по программировать на машинном коде

    Никто не программирует "на машинном коде". Максимум - патчи. Машинный код разделяют на данные и, непосредственно код, который дизассемблируют (переводят на более высокий уровень абстракции).
    Ответ написан
  • Телефон испортил 3gp видео во время записи. Как восстановить?

    EXL
    @EXL
    Энтузиаст
    Флешка какого производителя? Если китайский ноунейм - ее можно смело выбрасывать, проблем с ней вы поимеете много.
    Насчет восстановления - вряд ли оно предоставляется возможным. Нужно анализировать файл, смотреть, что в нем битое. Если только заголовок - попытаться восстановить можно, однако, если видеоданные побиты, то ничего не поправишь.
    Ответ написан
    Комментировать