Просмотр сообщений
|
Страниц: 1 ... 35 36 [37] 38 39
|
541
|
Qt / Установка, сборка, отладка, тестирование / Re: Приспичило собрать приложение под Win7 64 бита...
|
: Марта 03, 2016, 08:19
|
Для этого надо Qt 4.7.0 в 64 бита под этой виндой собрать. MinGW32 не умеет, выяснил это из разных форумов. Вроде есть MinGW-w64, но не ясно, соберётся ли им эта версия Qt, и вообще можно ли получить желаемое. Много чего обсуждают, у кого-то какие-то проблемы появляются, и ни разу не нашёл сообщения, что всё получилось. С Qt 4.х вообще не встречал, все сборки в 64 бита делают c Qt 5.x. В общем, вопрос - кто делал подобное с Qt 4.7?
Я собирал проект Qt 4.7.4 с помощью mingw-w64 https://sourceforge.net/projects/mingw-w64/ версия x86_64-5.3.0-posix-seh-rt_v4-rev0 Есть небольшие особенности). Мои ремарки по сборке 64 бит. Пришлось отключить tiff и поправить исходники. configure.exe -opengl desktop -fast -nomake demos -nomake examples -no-libtiff -mp
Изменения в исходных кодах ./src/corelib/tools/qsimd.cpp поменять в строке 288 C++ (Qt) #if defined(Q_CC_GNU) quint64 tmp; asm ("xchg %%rbx, %1\n" "cpuid\n" "xchg %%rbx, %1\n" : "=c" (feature_result), "=&r" (tmp) : "a" (1) : "%edx" ); #elif defined (Q_OS_WIN64) { int info[4]; __cpuid(info, 1); feature_result = info[2]; } #endif
вместо C++ (Qt) #if defined (Q_OS_WIN64) { int info[4]; __cpuid(info, 1); feature_result = info[2]; } #elif defined(Q_CC_GNU) quint64 tmp; asm ("xchg %%rbx, %1\n" "cpuid\n" "xchg %%rbx, %1\n" : "=c" (feature_result), "=&r" (tmp) : "a" (1) : "%edx" ); #endif
Весь проект собирается. Надо отметить, что QtCreator 32 bit не дружит с qmake 64 bit, его также необходимо пересобрать в 64 битной версии, или пользоваться командной строкой.
|
|
|
542
|
Qt / Пользовательский интерфейс (GUI) / Re: Отслеживание передвижений на сцене.
|
: Марта 02, 2016, 08:08
|
Можно сделать, например, так C++ (Qt) void MyView::mouseMoveEvent(QMouseEvent* event) { QGraphicsView::mouseMoveEvent(event); // уже обработано if ( event->isAccepted() ) return; if( event->buttons() & Qt::LeftButton ) { addOffset( event->pos() - previousPoint ); updateTransform( scale(), offset() ); } previousPoint = event->pos(); }
А в обработчике событий item помечать событие event->accept();
|
|
|
543
|
Qt / Общие вопросы / Re: Надежное чтение
|
: Февраля 29, 2016, 21:00
|
И что, по каждому тегу считать CRC? Не выглядит реально, слишком обременяет и чтение и запись.
Если требуется гарантия, то только так. И ни так уж это обременительно, как кажется. А если пользоваться, например, TCP/IP, то это гарантирует сам протокол. А что он (протокол) сделать может? Ну проверить заголовок и (иногда) сбивается ли длина? Что еще?
Обычно этого в подавляющем большинстве случаев достаточно. Либо используют что-то типа xml.
|
|
|
544
|
Qt / Общие вопросы / Re: Надежное чтение
|
: Февраля 29, 2016, 13:24
|
Если рассматривать сам метод бинарной десериализации, то никаких защит в нем не должно быть - этим должен заниматься протокол обмена.
Проверять необходимо пакет данных, который может представлять собой файл, пакет TCP|UDP и др. Анализирует содержимое пакета соответствующий парсер. Для этого пакет должен иметь внутри встроенный механизм определения корректности/целостности данных. К ним относятся различные виды контрольных сумм, магические числа (для определения, например, формата данных) и любая другая информация.
Таким образом, читаем файл целиком, как один пакет, например, QByteArray. Анализируем содержимое. Если что-то нас не устраивает -> сообщение об ошибке. Если все ок -> десериализуем данные. Если файл большой и не влезает в QByteArray, то желательно организовать его в виде набора пакетов. В общем случае файла произвольного формата задача не решается, должна быть возможность чтения в виде небольших блоков/порций, которые можно анализировать.
|
|
|
545
|
Qt / Qt Embedded / Re: Запуск нескольких команд с помощью QProcess
|
: Февраля 22, 2016, 20:34
|
Можно любую программу запустить на исполнение, поместив ее в файл скрипта или в виде текста содержимого скрипта, но... как уже писали программно нельзя ввести пароль. Можно использовать доступ через sudo или ssh, однако в любом случае заранее необходимо будет зарегистрировать доступ к su. А так правильный способ - - использовать Android API.
|
|
|
546
|
Qt / Вопросы новичков / Re: Qthread
|
: Февраля 16, 2016, 12:39
|
Такой подход может быть и правильным, все зависит от контекста самой задачи. Сигнал/слот механизм не обязательный к применению, а лишь один из многих способов организации программы. Если все работает как задумывалось, то программный код достаточный для решения Вашей задачи.
|
|
|
547
|
Qt / Qt-инструментарий / Re: автоматическое добавление инклудов в QtCreator
|
: Февраля 01, 2016, 18:06
|
Если класс из Qt, то после ввода имени класса можно нажать Alt+Enter.
Кое-где работает. Еще бы свои включения искала). Вообще давно ищу инструмент, который бы мог проанализировать все #include в проекте на предмет лишних/недостающих/циклических включений. Может знает кто?
|
|
|
549
|
Qt / Базы данных / Re: Qt 5.4.2 + Oracle 10g
|
: Января 26, 2016, 08:05
|
Подключения к БД oracle можно выполнить двумя способами. По SID C++ (Qt) QSqlDatabase database = QSqlDatabase::addDatabase( "QOCI", "SchemeName" ); database.setDatabaseName( sid ); database.setHostName( host ); database.setPort( port ); database.setUserName( user ); database.setPassword( password );
По Service name (текст в методе setDatabaseName не должен содержать пробелов) C++ (Qt) QSqlDatabase database = QSqlDatabase::addDatabase( "QOCI", connection_name ); database.setDatabaseName( QString::fromUtf8( "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=%1)(PORT=%2))(CONNECT_DATA=(SERVICE_NAME=%3)))" ) .arg( host ) .arg( port ) .arg( name ); database.setHostName( QString() ); database.setPort( int() ); database.setUserName( user ); database.setPassword( password );
И вроде как, connection_name не должно быть пустым.
|
|
|
550
|
Программирование / Общий / Re: Сценарий действия сил
|
: Января 23, 2016, 21:26
|
После компиляции он будет захардкорен. А скрипт можно будет менять без перекомпиляции программы.
После компиляции программы? Нет. Предлагается ведь не программу реализовать с помощью конечных автоматов, а пользователю дать возможность формировать схемы поведения в виде графа состояний и переходов. Когда пользователь сформирует схему или скрипт, команда Run запустит интерпретатор, который в runtime сформирует конечный автомат или любую другую модель поведения. Никакого хардкода.
|
|
|
551
|
Программирование / Общий / Re: Сценарий действия сил
|
: Января 23, 2016, 20:53
|
По сути stateMachine это захардкоренный скрипт.
Не согласен с таким утверждением. Скрипт - это всего лишь сценарий работы, который необходимо интерпретировать. StateMachine - это одна из возможных моделей поведения, реализующая сценарий. В качестве интерпретатора может выступать любая модель - последовательное исполнение команд, конечные автоматы, событийная модель, динамический сигнал-слот, клиент-сервер взаимодействие, активные объекты, модель актеров и т.п. Может даже использоваться также произвольное их сочетание. Какую конкретно модель выбрать зависит от условий решаемой задачи и/или предпочтений разработчика. Здесь конечный автомат не захардкоден, так как предполагается, что его схема динамически редактируется пользователем. Схема может быть представлена в виде скрипта, скрипт в виде схемы. Можно реализовать и то и другое, они взаимозаменяемы. Но для того и другого необходим интерпретатор - среда, в которой они должны функционировать.
|
|
|
552
|
Qt / Вопросы новичков / Re: константная ссылка в foreach
|
: Января 22, 2016, 12:04
|
Если вы используете такой вариант C++ (Qt) void ( const QList< int > & values ) { ... foreach ( const int & value, values ) { const_cast< int & >( value ) = 1; } ... }
то values не вызывает проверку того, что он shared. Данные будут изменены в обобщенном списке. Для выполнения detach() необходимо вызвать любой не константный метод values. И ... "implicit shared" сильно на производительности сказывается, так как не выполняются лишние копирования данных списка.
|
|
|
553
|
Qt / Вопросы новичков / Re: константная ссылка в foreach
|
: Января 22, 2016, 08:37
|
Реализация foreach в Qt несколько криворукая и имеет описанные ограничения, часто уступает в производительности простому for через итераторы или индексы. Вот в boost реализация оказалась отличной и без описанных ограничений. Но не тащить же еще и boost  Такое кастование - это зло, которое нужно срочно искоренить из проекта! К слову из-за того, что реализация QList implicit shared, таким кодом вы корректируете все взаимосвязанные с данным списком данные. Если есть необходимость изменения данных в массиве QList, то необходимо использовать либо индексы, либо итераторы, либо C11, либо еще что-то, но никогда кастование!
|
|
|
554
|
Программирование / Общий / Re: Сценарий действия сил
|
: Января 21, 2016, 11:23
|
_Bers имеет ввиду, что можно реализовать скриптовый язык или формат, а потом сформировать под него интерфейс для пользователя. Создание скрипта будет происходить автоматически путем нажатия пользователем на кнопки и вызова соответствующих диалогов ввода параметров. В итоге будет сформирован сценарий.
Для сценария необходим парсить, который нужно будет писать. Можно, конечно, взять готовый формат, например svg со всеми его достоинствами и недостатками. Наглядность сценария для пользователя в виде текста практически нулевая, поэтому нужно графическое представление (которое, скорее всего, все равно сведется к графу).
Здесь нужно оценить целесообразность затраченных усилий с учетом дальнейшего развития и сопровождения.
|
|
|
555
|
Программирование / С/C++ / Re: reinterpret_cast класса в массив
|
: Января 19, 2016, 17:14
|
Да, можно. Структура Vertex, например, плотно пакуется, поэтому можно использовать C++ (Qt) struct Vertex { float x; float y; float z; } Q_STATIC_ASSERT( sizeof( Vertex ) == 3 * sizeof( floet ) ); QVector< Vertex > vertices; QOpenGLBuffer buffer; ... buffer.write( offset, vertices.constData(), 3 * vertices.count() );
Все же нужно гарантировать размер, поэтому используем Q_STATIC_ASSERT
|
|
|
|
|