Ответы пользователя по тегу Qt
  • Азы OpenCL( C++, Qt 5). Как собрать простейшую программу?

    Nipheris
    @Nipheris Куратор тега C++
    limon_spb пожалуй не все так просто с OpenCL.DLL и видимо ее все-таки не нужно распространять со своим приложением. Однако, как и было сказано ранее, ее интерфейс универсален и ваше приложение не придется перекомпилить под каждое устройство. Вопрос только в том, кто ее должен поставлять.

    Вот на форуме Кроноса: https://forums.khronos.org/showthread.php/6299-Ope... господин pcchen утверждает, что OpenCL.dll и ICD-либа должны устанавливаться при установке драйверов на видяху. Видимо все-таки не должны вы класть OpenCL.dll со своей программой.

    Тогда мы возвращаемся к вопросу, почему программа не запустилась у вас на машине. Случайно наткнулся на ваш вопрос 1-в-1 на SO: stackoverflow.com/questions/22098210/deploying-ope... . Я думаю у вас была та же проблема - DLL в системных папках реализует API версии 1.1, а вы разрабатываете под API версии 1.2 (что определяется теми хедерами, которые вы подключили в проект). Поэтому правильно все-таки сначала решить проблему конкретно на вашей машине. Возможно, стоит обновить драйвера, и они обновят системные библиотеки.

    В той теме на форуме так и не пришли к единому мнению относительно того, откуда должна браться OpenCL.dll. Я склоняюсь к тому, что ставить ее должны драйвера. Кстати, Dithermaster в ответах на SO говорит то же самое. Погуглите еще "deploying opencl application".
    Вот еще одна тема с обсуждением (также не советуют деплоить OpenCL.dll самому): https://forums.khronos.org/showthread.php/11392-Ye...
    Ответ написан
    2 комментария
  • Как из файла json ввести данные в таблицу QTableView?

    Nipheris
    @Nipheris Куратор тега C++
    1) создать подходящую модель (например, наследоваться от QAbstractTableModel);
    2) загрузить данные из json;
    3) реализовать модель из п.1 так, чтобы она возращала значение конкретного свойства в зависимости от запрошенного столбца;
    Ответ написан
    Комментировать
  • Как эффективно тестировать клиент-серверные приложения написанные на Qt на одной машине?

    обмен идет через UDP

    QTcpSocket

    Непонятно, что из этого выбрать.

    Не совсем понял смысл выражения "значение QTcpSocket", но с точки зрения протокола IP, операционная система при стандартном способе привязки сокетов будет иденфтицировать сокет (и соответствующее приложение) по паре (IP адрес; порт). Если вы все-таки используете UDP и соответствующий тип сокетов, то вы так или иначе решаете задачу подключения нескольких клиентов к серверу (в случае TCP это делал бы для вас QTcpServer). В зависимости от выбранной вами модели управления, клиенты либо используют фиксированный UDP порт и посылают дейтаграммы с некоторого IP-адреса и этого порта, сюда же ожидая ответ от сервера, либо выбирают случайный свободный UDP-порт.
    В первом случае сложно называть клиентов "клиентами", т.к. они также висят на фиксированном порту и с точки зрения сети равноправны с сервером. Чтобы протестировать этот случай, можете попробовать добавить дополнительные IP-адреса вашей машине, и привязываться разными "клиентами" на разные адреса, чтобы пара (адрес, порт) была уникальной.
    А во втором случае проблем быть не должно, если порт выбирается случайным образом.
    Ответ написан
    2 комментария
  • Какие технологии выбрать для создания кроссплатформенного файлового менеджера?

    Nipheris
    @Nipheris Куратор тега C#
    За JavaFX говорить не буду, вроде штука развивается, возможно наконец будет нормальная джава для десктопа; сравнивать не могу, не пользовался
    Также я видел что-то про Qt Quick и QML

    пожалуй это и стоит рассматривать для новых проектов.
    Сам я им не пользовался, но говорят, что WPF гораздо мощнее, чем Qt

    Раньше, когда появился - да, был значительно мощнее (до появления QML). Вообще был наверное самой продвинутой технологией для десктопа. Но уже 2015-й год, Qt Quick 2 и все такое, так что Qt и WPF уже вполне сравнимы.
    Если не ошибаюсь, то это совсем не кроссплатформенное решение

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

    дотнетовская технология, появилась в .net 3.0, использует direct3d для отрисовки, windows-only. Если нужны еще подробности - пишите в комментарии.
    то я больше склоняюсь к Qt, так как скорость работы всё же важнее скорости разработки

    хороший выбор для кроссплатформенного файлового менеджера, только замечу, что вы выбираете вы достаточно смело - в 95% случаев люди ищут либу к знакомому языку/платформе, т.к. обычно именно язык новый язык изучить не могут/не хотят. Если вы уверены, что C++ вы тянете, то тогда без вариантов - Qt.
    Ответ написан
    6 комментариев
  • Скомпилированная программа на Qt просит библиотеку qt5cored.dll, где искать?

    Nipheris
    @Nipheris Куратор тега C++
    <Папка установки Qt>\qtbase\bin - берем все что нужно и копируем в папку с exe. Что конкретно нужно, можно выяснить с помощью Dependency Walker или просто пытаться запустить, пока не запустится. А, да, еще вам плагин для платформы понадобится, создаете рядом с exe папку platforms, идете в подпапку с таким же именем в qtbase\bin, копируете оттуда qwindows.dll. Если этого будет недостаточно - ошибку в комментарии.

    Пробовал переименовать qt5core.dll в qt5cored.dll, пишет, что не может найти вход в библиотеку.

    Переименовывать не стоит, даже если бы это заработало, вы бы поймали кучу непонятных ошибок при отладке. Вам нужно либо скачать готовые дебажные dll-ки, либо скомпилить дебаг-версию Qt самому.
    Ответ написан
    Комментировать
  • Как отобразить QWidget в QML приложении?

    Nipheris
    @Nipheris Куратор тега C++
    Сам не пробовал и не проверял, но есть отличный ответ на SO.

    Пишут, что можно в Qt Quick 1, но нельзя в 2+ по причине введения графа сцены.
    Ответ написан
    Комментировать
  • QTreeView и QSqlRelationTableModel/QTableModel?

    Nipheris
    @Nipheris Куратор тега C++
    Наиболее гибким вариантом в вашем случае я считаю наследника от QAbstractItemModel. Отображать его вполне можно с помощью QTreeView.
    Ответ написан
  • Какую книгу выбрать по сетевому программированию в Qt?

    Nipheris
    @Nipheris Куратор тега C++
    Читайте книги по сетям (а именно - слои OSI, TCP/IP, сокеты, про клиент-серверную архитектуру в целом, кто куда подключается, как передает данные).
    Читайте книги про техническую сторону веба (протокол HTTP, архитектура REST и т.д.).
    Когда вы поймете, что происходит при запросе www.yandex.ru в адресной строке, использовать класс QNetworkRequest не составит никакого труда.
    Ответ написан
    7 комментариев
  • На чем лучше писать программы под Windows?

    Nipheris
    @Nipheris Куратор тега C#
    Сейчас Шарп с WPF-ом и C++ с Qt-ом примерно равны по возможностям. Изначально WPF конечно был более продвинутым, но с момента его появления прошло уже много времени, а развивается он слабо, поэтому Qt его "догнал".
    Но для большинства разработчиков все упирается в язык. Не все хотят учить второй язык для изучения технологии, не все хотят учить C++.
    Ответ написан
    Комментировать
  • Почему пропадает член класса?

    Nipheris
    @Nipheris Куратор тега C++
    Вы случайно не забыли там вызвать конструктор базового класса QMapValidator в конструкторе дочернего Class2? Потому что других странностей я не вижу, а вот если вы все-таки забыли, то отработает конструктор по умолчанию (а он есть, если б не было - была б ошибка компиляции), который, конечно, ничего вам не добавит.
    По идее addValid все-таки должен работать - с ним все ок или та же проблема?
    Ответ написан
    1 комментарий
  • Что использовать в С++(Qt,Boost) для простого серверного приложения-хранилища данных?

    Nipheris
    @Nipheris Куратор тега C++
    cpp-netlib.org или doc.qt.io/qt-5/qnetworkrequest.html если нужен HTTP
    Boost::Asio, если не нужно HTTP
    Berkeley Sockets все еще в моде, если не боитесь C-style
    На последние два можно накрутить Protocol Buffers через stream-ы, если протокол достаточно сложный или предполагает расширение.
    Ответ написан
    Комментировать
  • Как правильно составить функцию qHash для объекта содержащего два QString? Или просто какой алгоритм для хеширования двух строк?

    Nipheris
    @Nipheris Куратор тега C++
    А почему такая странная потребность в УНИКАЛЬНОМ хэше (который вы кстати в принципе не получите для двух строк по 20 символов, т.к. хэш-значение - типа uint)?
    > это РАЗНЫЕ объекты, несмотря на то что конкатенация firstName + lastName равна.
    ну и пусть, совпадет один раз, не такой уж частый кейс для имени и фамилии. У вас таких Каримов с одинаковым конкатенированным именем тысяча штук будет?
    Ответ написан
    4 комментария
  • Какова должна быть структура проекта на Qt?

    Nipheris
    @Nipheris Куратор тега C++
    Я думаю структура проекта мало определяется самим Qt, и будет такая же, как и других C++ - проектов. Однако положить файлы в подпапку вам никто не запрещает.
    Ответ написан
    Комментировать
  • Как выполнять функцию без зависания главной формы в qt?

    Nipheris
    @Nipheris Куратор тега C++
    Берете и разбирайтесь с QThread. Для остановки/запуска используете сигналы/слоты (смысл QThread в том, что он умеет запускать свой eventLoop, и ловить QueuedConnection-сигналы из других потоков)
    Ответ написан
    Комментировать
  • Указатель на функцию из библиотеки на Си в С++ класс?

    Nipheris
    @Nipheris Куратор тега C++
    Очень просто: чтобы поменьше влиять на остальной код на C++, который у вас уже написан, сделайте следующее:
    1) заведите обычную функцию (НЕ член класса) send_sms, указатель на которую отдадите в либу;
    2) сделайте в этой функции все, что необходимо по задаче (отправить смс? :));
    3) реализуйте для MainWindow синглтон (проще) или сервис (правильнее), чтобы иметь возможность получить доступ из внешней функции send_sms к экземпляру окна;
    4) у MainWindow дергайте метод test или любой другой, чтобы передать в него нужные данные. Если сделаете синглтон, будет что-то вроде этого: MainWindow::instance()->test(...);
    Ответ написан
    Комментировать
  • Вопрос по C# и net framework?

    Nipheris
    @Nipheris Куратор тега C++
    > Не каждый пользователь будет его устанавливать.
    Кто еще не установил - тому стоит это сделать, MS даже через апдейт систему предлагает дотнет поставить. А еще фишка в том, что и программам на плюсах в подавляющем большинстве случаев приходится ставить райнтайм. Конечно, его dll-ки можно просто положить в папку с программой, но это плохой путь по ряду причин. Итого, и для шарпа и для плюсов нужно ставить "среду", единственное отличие - рантайм плюсов будет легче (правда сама прога, юзающая Qt и включающая его библиотеки будет значительно тяжелее).
    > На сколько я знаю, на семерке "из коробки" стоит 3 версия фреймворка
    Тройка - на Висте, на семерке - 3.5.
    > Так что же лучше - использовать C# или посмотреть в сторону C++ и Qt?
    Тут обычно гораздо важнее вопрос кроссплатформенности. Сейчас Mono обеспечивает только WinForms, т.е. того же WPF на никсах пока не видать (и видимо уже не увидим). Поэтому я сейчас безоговорочно выбрал бы Qt, если б делал десктоп-софтину не только для винды (в 2015 году лично я не могу относиться к функциональности и CPU-oriented архитектуре WinForms всерьез). Поэтому решение принять достаточно просто:
    1) если у вас line of business-приложение (напр., очередная утилитка для расчета кредитных условий по продуктам банка) и windows-машины в парке - смело берем C#, WPF, и решаем поставленную задачу;
    2) если у вас приложение для широкого круга лиц, и его интерфейс сложнее интерфейса перекодировщика WAV в MP3 - берем Qt, пишем код без и получаем приложение, которое запустится на большинстве десктопных машин, а не только на тех, где винда.

    P.S.
    1) безусловно, есть и более чем приличные коммерческие десктопные программы на шарпе, например очень удобный и навороченный референс-менеджер Citavi, но я думаю её авторы просто приняли решение поддерживать только винду, и это их устраивает. Кроме того, они используют много сторонних платных GUI-контролов у себя в продукте.
    2) реализовывать взаимодействие управляемого и нативного кода не так уж приятно, поэтому если ключевая библиотека реализована на плюсах, то и остальное приложение логично сделать нативным.
    Ответ написан
    Комментировать
  • Как последовательно показать результаты изменения одной переменной многими потоками?

    Nipheris
    @Nipheris Куратор тега C++
    > Просто синхронные вызовы ролла показывают лишь последний результат.
    ну так а почему асинхронность сразу значит - несколько потоков? И причем тут вообще асинхронность - вам нужно сделать нормальную анимацию, анимация - это отрисовка кадров в соответствии с ходом времени. Последний результат виден потому, что вы не возвращаете управление в цикл приложения, чтобы оно могло нормально обработать прочие сообщения. Уберите всю эту многопоточность, сгенерьте рандомом перед анимацией все игры, которые хотите мельком показать, поставьте обыкновенный таймер (QTimer) и отрисовывайте по сигналу таймера игры по очереди, пока не дойдете до последней - той что "выпала". Разберитесь с матчастью по mainloop и анимации и все станет ясно как божий день. Еще раз - никаких потоков для вашей задачи вам не надо, тем более 20 штук.
    Ответ написан
  • Как работает механизм signal-slot QT, если нужно сигнал из объекта одного потока передать в слот объекту другого потока?

    Nipheris
    @Nipheris Куратор тега C++
    Ключ к пониманию передачи сигналов - понимание смысла существования QThread:

    > A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop inside the thread.

    Запуск собственного цикла обработки сообщений и дает возможность получать их в том числе и из других потоков. Фишка сигналов/слотов кьюта в том, что это еще и простая message queue система, наподобие эрланговской, если сталкивались. Вызов в рамках одного потока - это прямой вызов подписанных слотов на этом же стеке, а вот QueuedConnection или межпоточный вызов кладут в очередь соответствующего потока сообщение (эти сообщения лежат в одной очереди с сообщениями от ОС), и поток будет их извлекать в event-loop-е. Таким образом, вы просто просите другой поток вызвать слот, а вызовет он его когда в очередной раз будет отрабатывать цикл сообщений и он дойдет до сообщения о вызове слота.

    > It is safe to connect signals and slots across different threads, thanks to a mechanism called queued connections.
    doc.qt.io/qt-5.4/qt.html#ConnectionType-enum
    Qt::QueuedConnection - The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
    Ответ написан
    4 комментария
  • Как выгрузить окно приложения на qt++?

    Nipheris
    @Nipheris Куратор тега C++
    У вас где-то в коде:
    QMainWindow *window = new QMainWindow();
    вам потом надо сделать:
    delete window;
    а потом снова создать его. Если нужно именно чтобы
    > глаз не мозолило
    то проще делать hide и show
    Ответ написан
    Комментировать