Задать вопрос
Ответы пользователя по тегу Qt
  • Как использовать интерфейс (ui) в созданном заголовочном файле?

    EXL
    @EXL
    Энтузиаст
    Если вам нужны динамические диалоги, то можно сделать так:

    QUiLoader uiLoader;
    QFile file("sortdialog.ui");
    QWidget *sortDialog = uiLoader.load(&file);
    if (sortDialog) {
        ....
    }

    Источник.

    Но скорее всего вам нужно просто создать форму с классом. Для этого в Qt Creator выбираете "File" -> "New File or Project" -> "Qt" -> "Qt Designer Form Class".

    При желании в новый файл формы *.ui можно скопировать содержимое из старого (или вообще перезаписать его вашим старым *.ui). Всё будет работать.

    А если вам нужно зафиксировать изменения в форме из внешнего класса, то всегда можно воспользоваться указателем:

    TestClass.h:
    #ifndef TESTCLASS_H
    #define TESTCLASS_H
    
    #include "ui_MainWindow.h"
    
    class TestClass
    {
    public:
        TestClass();
        void changeTextOnForm(Ui_MainWindow *mainWindow);
    };
    
    #endif // TESTCLASS_H

    TestClass.cpp:
    #include "TestClass.h"
    
    TestClass::TestClass()
    {
    }
    
    void TestClass::changeTextOnForm(Ui_MainWindow *mainWindow)
    {
        mainWindow->label_2->setText(QString("Text from ") + Q_FUNC_INFO);
        mainWindow->textBrowser->append(mainWindow->label_2->text());
    }

    MainWindow.cpp:
    ...
    void MainWindow::on_pushButton_clicked()
    {
        TestClass testClass;
        testClass.changeTextOnForm(this->ui);
    }
    ...
    Ответ написан
  • Что делать с ошибкой undefined reference to при передаче параметра в функцию?

    EXL
    @EXL
    Энтузиаст
    Часть кода separate_image выглядит следующим образом:
    void separateImage(char* path_to_image)
    {
        ...
    }

    А нужно:
    void MainWindow::separateImage(char* path_to_image)
    {
        ...
    }

    Так как separateImage() вы объявили как приватный метод класса MainWindow.
    Внимательно читаем документацию на Qt и учебник по языку C++.
    Ответ написан
    1 комментарий
  • Как выловить ошибку в приложении QT?

    EXL
    @EXL
    Энтузиаст
    На 2 компьютерах(windows 7 и 8) с установленной QT все работает. При запуске на компьютерах без QT программа падает.

    Читать документацию. Вы неправильно разворачиваете своё приложение в средах Windows:
    Как развернуть(deployment) Qt приложение на windows?
    https://qt-project.org/doc/qt-5/windows-deployment...
    Ответ написан
    Комментировать
  • Как подключить autotools библиотеку к qmake проекту?

    EXL
    @EXL
    Энтузиаст
    Лучше всего будет переехать с системы сборки autotools на QMake/QBS. Я делал это таким образом:
    Для каждой платформы сконфигурировал библиотеку, сохранив файлы "config.h". Затем на каждой платформе собрал библиотеку, сохранив лог сборки в файл: make &> make.log На основе полученных данных и файлов ручками написал платформонезависимый "*.pro"-файл, полностью интегрировав библиотеку в проект и избавившись от монструозного autotools. На это ушло приблизительно 1.5-часа, в библиотеке было приблизительно 50 "*.c" и "*.h"-файлов.
    Ответ написан
  • Как сделать border в тексте QLabel?

    EXL
    @EXL
    Энтузиаст
    Если вам нужно выделить контур самого QLabel'а, то можно просто воспользоваться Qt Style Sheets (QSS):

    vaw5jdE.png
    ui->label->setStyleSheet("QLabel {"
                                 "border-style: solid;"
                                 "border-width: 1px;"
                                 "border-color: black; "
                                 "}");

    Если необходимо выделить контур именно текста, то может помочь Shadow Effect:

    FEZVbrJ.png
    QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(this);
    effect->setOffset(-1, -1);
    effect->setColor(Qt::yellow);
    ui->label->setGraphicsEffect(effect);


    Контур текста с размытием:

    vAuWBUn.png
    QGraphicsDropShadowEffect *eff = new QGraphicsDropShadowEffect(this);
    eff->setOffset(0, 0);
    eff->setBlurRadius(5.0);
    eff->setColor(Qt::red);
    ui->label->setGraphicsEffect(eff);


    Обводка текста с помощью перегруженного метода paintEvent():

    nDejj4M.png
    void Widget::paintEvent(QPaintEvent *)
    {
        int off = 10;
        QPainter painter(this);
        QPainterPath path;
        QFont drawFont("Sans", 20);
        path.addText(off, drawFont.pointSize() + off, drawFont, text());
        painter.setRenderHints(QPainter::Antialiasing);
        painter.strokePath(path, QPen(QColor("#FF8C00"), 4));
        painter.fillPath(path, QBrush(Qt::black));
        resize(path.boundingRect().size().toSize().width() + off * 2, path.boundingRect().size().toSize().height() + off * 2);
    }
    Ответ написан
    Комментировать
  • Какой метод указывает QWidget не исчезать после отображения методом show() ?

    EXL
    @EXL
    Энтузиаст
    Вы что-то делаете неправильно.
    В данном случае вы создаёте объект класса OptionApp на стеке, это значит что после выхода из функции он будет разрушен. Исправьте на

    OptionApp *optionDialog = new OptionApp(this);
    optionDialog->show();

    И не забудьте в конструкторе класса виджета этого окна вызвать:

    setAttribute(Qt::WA_DeleteOnClose);
    Чтобы избежать утечки памяти.

    Это если вам нужен не модальный диалог. В противном случае просто воспользуйтесь
    методом:
    OptionDialog.exec();
    Ответ написан
  • Как развернуть(deployment) Qt приложение на windows?

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

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

    Current Directory/
    	|
    	+-platforms/
    	|	|
    	|	+-qwindows.dll
    	|
    	+-sqldrivers/
    	|	|
    	|	+-qsqlite.dll
    	|
    	+-DatabaseAnime.exe
    	|
    	+-Qt5Core.dll
    	|
    	+-Qt5Gui.dll
    	|
    	+-Qt5Sql.dll
    	|
    	+-Qt5Widgets.dll
    	|
    	+-icudt52.dll
    	|
    	+-icuin52.dll
    	|
    	+-icuuc52.dll
    	|
    	+-libgcc_s_dw2-1.dll
    	|
    	+-libstdc++-6.dll
    	|
    	+-libwinpthread-1.dll

    И ещё несколько советов.
    1. Если ваш проект не использует QtWebkit, вы можете пересобрать библиотеку Qt 5.3.1, без библиотеки icu, тогда ваше приложение "похудеет" на 27 MB.
    2. Опять же, если вы не используете QtWebkit, вы можете собрать Qt 5.3.1 статически, получив единый испольнительный файл без всяких внешних DLL-библиотек и плагинов, который можно сжать upx'ом и получить exe-файл приемлемых размеров (~3-5 MB).

    Подробнее про развертывание можно прочитать в официальной документации.
    Ответ написан
    2 комментария
  • Запустил на сборку проект Qt. Антивирус заругался на qsvgicond.dll. Безопасный ли это файл?

    EXL
    @EXL
    Энтузиаст
    Если Qt был установлен с официального сайта, то всё безопасно; просто антивирус (вы кстати не указали какой) у вас параноик и ложно сработал. На всякий случай загрузите файл qsvgicond.dll на https://www.virustotal.com/ и посмотрите, сколько антивирусов отреагируют на него подозрительно.
    Ответ написан
    1 комментарий
  • Как исправить ошибку при компилировании библиотеки Qt5.3.1?

    EXL
    @EXL
    Энтузиаст
    Есть идеи?

    Есть.
    Во-первых, по первому же запросу гуглится решение этой проблемы.
    Во-вторых, Qt больше не использует MinGW, а использует MinGW-w64 (32- и 64-битные сборки). Следовательно поддержка MinGW второстепенна, отсюда и вылазят подобные ошибки компиляции. Рекомендую вам установить MinGW-w64.
    Ответ написан
    2 комментария
  • Наличие руководств по статической сборке qt 5.2 программы под windows msvc 13?

    EXL
    @EXL
    Энтузиаст
    Там всё просто - пересобираете сам Qt-5.3/Qt-5.2 с опцией -static и, желательно, с отключенной библиотекой icu (очень много занимает), а затем компилируете свою программу статически с использованием новоиспечённого инструментария.

    Подробнее можно почитать тут.

    Ещё не забудьте прикрутить статически C++/C-Runtime библиотеки от MSVC. Как это делается в MSVC, я не знаю, в MinGW элементарно:
    QMAKE_LFLAGS += -static -static-libgcc -static-libstdc++
    Кстати, при статической сборке QtWebkit не будет собираться.

    И ещё, если размер статически слинкованной программы слишком велик - сожмите её upx'ом.
    Ответ написан
  • Как оставить след за движущейся линией QPainter?

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

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

    mjBUA7j.png

    Там можно рисовать такие вот штуки, посмотрите примеры из документации.
    Ответ написан
    Комментировать
  • Как отрисовать большое количество интерактивных элементов в Qt?

    EXL
    @EXL
    Энтузиаст
    Смотрели в сторону QGraphicsScene/QGraphicsView для квадратиков?
    Ответ написан
    Комментировать
  • Как собрать проект open source в Qt?

    EXL
    @EXL
    Энтузиаст
    Если в этом проекте есть файл "Makefile.am", то активируйте в "Help -> About Plugins..." плагин AutotoolsProjectManager, а затем перезапустите Qt Creator и откройте этот файл в программе;

    Если ничего подобного нету, то сделайте проектный файл ручками с помощью "File -> New File or Project... -> Import Project". Ттаким образом на основе созданных файлов можно будет сделать полноценный и привычный "*.pro"-файл.
    Ответ написан
    Комментировать
  • Как в QT отследить бездействие пользователя?

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

    1T5jlEf.gif

    Можете использовать Qxt в своём проекте (доступны версии под Mac OS, Win и Linux), или выдернуть реализацию функции idleTime() для различных систем:
    Win, X11 (GNU/Linux), Mac OS.

    Скачать Qxt можно здесь.
    Ответ написан
    4 комментария
  • Как подключить 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"));
    }

    Удачи!
    Ответ написан
    Комментировать
  • Оiибка при подключении QDomDocument в Qt

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

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

    EXL
    @EXL
    Энтузиаст
    Для распространения своей утилиты под различными операционными системами вы можете воспользоваться кросс-платформенным установщиком Qt Installer Framework 1.5.0. Если мне не изменяет память - возможность удаления программы там присутствует. А вообще лучше всего сделать так:
    Для Windows - установщик, который создает в меню "Пуск" ярлык на "unist.exe", удаляющий программу.
    Для Linux - deb-пакет/tar.gz-пакет. Функция удаления линуксоидам не нужна, эту задачу решит пакетный менеджер, против которого ставить софт не рекомендуется.
    Насчет Mac OS/OS X не знаю, но думаю там есть возможность удаления установленного приложения из каталога установленных программ.

    Делать внутри программы функцию удаления этой программы - весьма плохой тон.
    Ответ написан
    Комментировать
  • Как хранить выбранный option в select?

    EXL
    @EXL
    Энтузиаст
    @savostin не понимаю, в чем именно ваша проблема. В Qt есть удобные классы для хранения настроек - QSettings. На примере: есть опции в программе, к примеру, выбор языка и QCheckBox. Пусть каждому языку соответствует индивидуальный идентификатор: Английский - "en", Русский - "ru", Испанский - "es". Опция "Cool Option", охарактеризована QCheckBox'ом.

    Создаете объект класса QSettings, создаете методы "loadSetting()" и "saveSettings()". При запуске программы метод "loadSetting()" осуществляет чтение настроек из файла или реестра, а затем, в соответствии с прочитанными настройками, расставляет выбор опций в интерфейсе. После завершения работы с программой вызывается метод "loadSetting()", который сохраняет все настройки пользователя.

    Очень удобно использовать для этой цели *.ini-файлы:

    [PDA_Maze]
    TimerMode=0
    MapMode=1
    MapSize=29
    ShowStep=false
    ScaleScreen=0
    SmoothScreen=false
    AppLanguage=ru


    Пример подобной реализации сохранения настроек можно посмотреть тут.
    Ответ написан
  • Подключение 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. При линковке никаких предупреждений не будет, но программа не запустится.
    Ответ написан
  • Сборка 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"

    Перед построением библиотеки.
    Ответ написан