crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику SABROG ::: Спасибо сказали: 229 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
28.2.2010, 22:53 Всплывающие окна
Не вызывай show() в main.cpp. Твой hide() выполняется в конструкторе, еще до того как ты вызовешь show() или a.exec().
breeve,
28.2.2010, 22:44 Всплывающие окна
Цитата(breeve @ 28.2.2010, 22:19) *
А у меня появляется пустое окно.


Выражайтесь яснее. Речь ведь идет о панели задач, где появляется лишний пустой прямоугольник.
breeve,
28.2.2010, 21:23 Всплывающие окна
Цитата(Litkevich Yuriy @ 28.2.2010, 15:21) *
Цитата(breeve @ 28.2.2010, 18:00) *
Т.е. оно на вид прозрачное и по сути тоже является таковым..
См. Окно «прозрачное» для мыши

Как-то слишком просто. Может это решение только для отношения QWidget->QWidget, а окошки операционной системы оно не затрагивает? Просто когда сам искал нашел лишь 2 решения:
- делать дырку через setMask под курсором мыши размером 1x1
- рисовать на контекст рабочего стола напрямую средствами ОС

Первый вариант плох тем, что нижнему окну постоянно приходят события Hover, LeaveHover и оно себя забавно ведет при таком раскладе, если пытается какой нибудь виджет подсвечивать. А второй вариант плох тем, что изображение быстро затирается при обновлении рабочего стола, поэтому нужно постоянно перерисовывать. И вроде как это приводит к морганию картинки (flickering).
---
Всё, я понял, не внимательно прочитал первый пост SASA. У него 2 Qt'шных виджета. Тут ничего общего с окнами, которые пытаются делать люди на WINAPI.
breeve,
27.2.2010, 2:56 [РЕШЕНО] Работа с функцией seek
Цитата(AD @ 27.2.2010, 0:47) *
Будем считать, что априори это так и надо.


Отрицательное значение для Windows функции это перемещение в обратную сторону. Как это связано с вопросом перемещением указателя в конец файла я не понял. Разница между QIODevice::seek() и SetFilePointer в том, что первый берет абсолютное смещение в файле, а второй берет относительное смещение от текущей позиции. Конец файла для seek() это seek(size()), а для SetFilePointer это offset+(currentFileSize-offset):
Пример. Размер файла 10 байт. Текущая позиция 5.
currentFileSize = 10
offset = 5
Переменная которая передается в SetFilePointer = 5+(10-5) // 10
...
0+(10-0) = 10
10+(10-10) = 10

Теперь нам надо реализовать тот же функционал перемещения указателя в любую сторону исходя из текущего положения указателя (offset) и переданного смещения (shift). Возьмем всё тот же пример, 5 текущая позиция, 10 размер файла.
-5+0 = -5 перемещаемся на 5 байт назад
-5+1 = -4 на 4 байта назад
-5+2 = -3
-5+3 = -2
-5+4 = -1
-5+5 = 0 стоим на месте
-5+6 = 1 вперед на 1 байт
(хрен знает что за логика такая, то туда то сюда)
qint64 _offset = _writeHandle->pos();
...
SeekSet(shift);
...
void T::SeekSet(unsigned int shift)
{
_offset += -_offset + shift;
_writeHandle->seek(_offset);
}
AD,
26.2.2010, 23:02 Кодировки, кодировки...
Наткнулся на такую библиотеку определения кодировки. Написана на Си, алгоритм содран с детектора Мозиллы, лицензия LGPL.
Rocky,
26.2.2010, 21:30 Кодировки, кодировки...
Цитата(Rocky @ 26.2.2010, 20:21) *
не позволяет определить автоматически кодировку


Qt умеет определять только UTF16/32 по BOM'у. Так что на него не полагайся. Твоя задача сводится к реализации своего варианта программы "Штирлиц", но даже она ошибается. Поэтому проси пользователя, чтобы жестко задавал исходную и желаемую кодировки, если автоматически определить не удалось. Думаю в интернете должны быть статьи как по частотному анализу букв определить кодировку файла. В разных языках частота встречаемости тоже разная Может быть даже готовые библиотеки есть какие-нибудь.

Простой алгоритм заключает в том, чтобы последовательно предполагать кодировки файлов и пытаться конвертировать другую, затем подсчитывать встречаемость букв. Но этот алгоритм будет работать только на более менее больших файлах, где русский и английский текст не миксуются 50/50.
Rocky,
26.2.2010, 18:14 [РЕШЕНО] Работа с функцией seek
Цитата(AD @ 26.2.2010, 15:45) *
unsigned int shift

В прошлой версии ты ограничился 32 битным смещением и соответственно максимальным размером файла в 4Гб. Может лучше qint64 поставить?

Цитата(AD @ 26.2.2010, 15:45) *
_writeHandle -> seek(-_offset + shift);


Предположим, что -offset = -20, а shift = 19, тогда смещение будет -1. Я выше писал, что отрицательные значения передавать нельзя.
AD,
26.2.2010, 1:12 Где в Qt Creator Resource Browser?
Я до конца не понял о чем речь. Уточни что имеется ввиду Редактор Ресурсов или некий Браузер Ресурсов? Файл ресурсов редактируется точно также как и .cpp файл по двойному щелчку. Возможности перетаскивать мышкой картинки из ресурсов на виджет я никогда не видел ни в Designer'e ни в QtCreator'e, ни в интеграторе для Eclipse. И я так думаю, что такой возможности никогда не будет, т.к. есть много разных способов заставить виджет отображать картинку и стандартный это добавить на виджет QLabel и в свойствах объекта точно также как и с windowIncon выбрать файл из ресурсов.
l0ki,
23.2.2010, 20:05 проблема с дебагером
Если ты про это

INCLUDEPATH += D:\Code\qextserialport-1.2win-alpha
QMAKE_LIBDIR += D:\Code\qextserialport-1.2win-alpha\build
LIBS += -lqextserialportd


То я думаю, что вместо жестко заданных путей здесь должны быть переменные окружения или пути должны быть относительными, если исходники библиотеки qextserialport будет распространяться с твоей программой. А QMAKE_LIBDIR вообще можно опустить:

LIBS += -LD:/Code/qextserialport-1.2win-alpha/build -lqextserialportd


Вообще многое зависит от того на каких ОС будет собираться программа и какой компилятор будет использоваться.
neyro,
23.2.2010, 19:52 проблема с дебагером
Секция INSTALLS

Пример из QtCreator'a

include(../qtcreator.pri)

win32 {
    DLLDESTDIR = $$IDE_APP_PATH
}

DESTDIR = $$IDE_LIBRARY_PATH

include(rpath.pri)

TARGET = $$qtLibraryTarget($$TARGET)

contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols

!macx {
    win32 {
        target.path = /bin
        target.files = $$DESTDIR/$${TARGET}.dll
    } else {
        target.path = /$$IDE_LIBRARY_BASENAME/qtcreator
    }
    INSTALLS += target
}


Потом make install и запускаешь уже оттуда.
neyro,
23.2.2010, 19:00 проблема с дебагером
Скачай программу depends (Dependency Walker), открой ей свою программу и запусти профайлинг (F7)

Ошибка -1073741515 - C0000135 - 135 - STATUS_DLL_NOT_FOUND

Полагаю библиотека QExtSerialPort собрана динамически. Значит должна быть какая-нибудь QExtSerialPortd.dll, которую почему-то не поместили в одну и ту же папку где и ComTool.exe

gdb пытается загрузить программу, но операционка ему показывает кукиш, так как программа требует .dll, а раз нет загруженной программы (process), то gdb ругается:

Цитата
You can't do that without a process to debug
neyro,
23.2.2010, 16:36 Секреты и интересные возможности Qt
Кроссплатформенный метод установки приоритета для приложени. Навеяно этим постом.

Вариант 1.
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qApp->thread()->setPriority(QThread::HighestPriority);
    return a.exec();
}


Вариант 2. Установка приоритета после входа в цикл событий.
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <QtCore/QMetaType>

Q_DECLARE_METATYPE(QThread::Priority)
class CoreApplication : public QCoreApplication
{
        Q_OBJECT;
public:
        CoreApplication(int& argc, char* argv[], QThread::Priority priority = QThread::InheritPriority)
            : QCoreApplication(argc, argv)
        {
            qRegisterMetaType<QThread::Priority>();
            connect(this, SIGNAL(priorityChanged(QThread::Priority)),
                            SLOT(changePriority(QThread::Priority)),
                            Qt::QueuedConnection);
            if (priority != QThread::InheritPriority)
                setPriority(priority);
        }

        inline void setPriority(QThread::Priority priority) {emit priorityChanged(priority);}
        inline QThread::Priority priority() const {return thread()->priority();}
protected slots:
        void changePriority(QThread::Priority priority)
        {
            thread()->setPriority(priority);
        }
signals:
        void priorityChanged(QThread::Priority priority);
};

int main(int argc, char *argv[])
{
    CoreApplication a(argc, argv, QThread::HighestPriority);
    return a.exec();
}

#include "main.moc"

Вариант 3. Более легковесный вариант установки приоритета после входа в цикл событий, если вместо класса Object будет какой-нибудь MainWindow.
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>

class Object : public QObject
{
    Q_OBJECT;
public:
    Object(QObject *parent = 0) : QObject(parent) {}
    void setThreadPriority(QThread::Priority priority)
    {
        QMetaObject::invokeMethod(this, "changePriority", Qt::QueuedConnection, Q_ARG(int, static_cast<int>(priority)));
    }
protected:
    Q_INVOKABLE void changePriority(int priority)
    {
        qApp->thread()->setPriority(static_cast<QThread::Priority>(priority));
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
        Object object;
        object.setThreadPriority(QThread::HighestPriority);
    return a.exec();
}

#include "main.moc"


Для Windows стоит разделять понятия "класс приоритета приложения" и "приоритет потока". Все приложения изначально получают класс приоритета NORMAL_PRIORITY_CLASS и приоритет потока THREAD_PRIORITY_NORMAL. Предположим, что мы вызываем метод QThread::setPriority(QThread::TimeCriticalPriority), чтобы выделить самый высокий приоритет. К нашему удивлению в том же TaskManager'e приоритет будет стоять "Средний". Но в Windows количество возможных приоритетов аж 31 штука. Самый высокий достигается комбинацией установки класса REALTIME_PRIORITY_CLASS и приоритета THREAD_PRIORITY_TIME_CRITICAL. В Qt нет возможности установки класса приоритета, поэтому решением может быть вызов WINAPI ::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS);, или установка класса через TaskManager, или установка класса приоритета в момент запуска приложения:

start /REALTIME myprogram.exe


Установка приоритета приложения для linux может не работать в некоторых ситуациях о чем сказано в документации к метод QThread::setPriority().
Litkevich Yuriy,
23.2.2010, 0:47 проблема с дебагером
В QtCreator'e указал путь к gdb? Возможно старая версия gdb.

Если нет времени разбираться с отладчиком в QtCreator'e используй gdb в консоли. http://sourceware.org/gdb/current/onlinedocs/gdb.html

cd D:\Code\ComTool\debug
gdb -ex 'r' comtool.exe
neyro,
23.2.2010, 0:19 QListView
Цитата(cat386 @ 22.2.2010, 22:47) *
Привет All столкнулся с проблемой,
необходимо список отображать как в файловых менеджерах
т.е. что бы прокрутка была не вниз а вбок...
кто что может подсказать


Такого поведения я не видел ни в одном файловом менеджере каким удавалось пользоваться:
- Norton Commander
- Dos Navigator
- Far Manager
- Midnight Commander
- Volkov Commander
- Проводник
- Konqueror
- Nautilus
- Dolphin
- Total Commander
- WinCommander

т.ч. ты чего-то напридумывал...
cat386,
22.2.2010, 1:12 Опять. Проблема с компиляцией Qt4.6.2
Цитата(Andrewshkovskii @ 21.2.2010, 19:43) *
странная шутка вышла, удалил сорцы и снова распаковал - начал конфигурировать через cmd(ранее MSYS) и все пошло.чудо.:)
====
Забыл спросить, для распаралеливания билда через mingw32-make какую опцию надо использовать?


Тролли поломали сборку в MSYS еще несколько версий назад, после этого я не пробовал собирать. mingw32-make невозможно распараллелить, только make от MSYS.
Andrewshkovskii,
16.2.2010, 10:27 Qt eLearning
В одном из видео увидел название книги "Introduction to Design Patterns in C++ with Qt4". Оказывается она бесплатная и иногда обновляется, дополняется. Её домашняя страничка http://oop.mcs.suffolk.edu

В первую очередь для меня она представляет такие интересные темы как использование паттернов с Qt и UML диаграммы.
AD, arial, Litkevich Yuriy, Vass,
26.1.2010, 14:13 выравнивиние изображения в QTextEdit
setHtml(), а в коде уже используй css. Если нужно менять стиль, то предыдущий блок полностью затираешь и вставляешь новый - измененный.
pussbb,
17.1.2010, 11:05 QWheelEvent - прокрутка в обе стороны
Цитата(warlock @ 17.1.2010, 2:43) *
На данный момент свойство увеличиваеться при прокрутке колеска как вперед, так и назад.


Проверяй свойство int QWheelEvent::delta () const на отрицательность/положительность значения. Отрицательные значения - прокрутка назад, положительные - вперед.
warlock,
14.1.2010, 23:57 компиляция плагина и приложиния при помощи одного pro файла
Скомпилировать можно. Однако зависимости (depends) работать не будут, поэтому плагин можно поставить в начало очереди:

TEMPLATE = subdirs

SUBDIRS = plugin.pro myapp.pro


В данном случае на subdirs можно не обращать внимания, все 3 .pro файла находятся в одной директории. К сожалению это не отвечает на вопрос о компиляции нескольких проектов одним .pro файлом.
frg10, igor_bogomolov,
27.12.2009, 19:49 QtConcurrent нужен совет по использованию
Есть код брутфорса, который делает 4294967295 (int32) операций. По диспетчеру задач вижу, что используется только одно ядро процессора. Поэтому решил посмотреть на возможности класса QtConcurrent. В принципе задача следующая, распределить нагрузку на все ядра. 4294967295 / QThread::idealThreadCount(). Если брать конкретно ситуацию с двумя ядрами, то одно ядро должно перебирать (4294967295 / 2 = 2147483647,5) диапозон 0-2147483647, второе 2147483647-4294967295. Если один из потоков находит нужную последовательность, то я хочу иметь возможность вернуть результат и прервать все остальные потоки (сколько бы ядер не было). Также я планирую выводить QProgressDialog и если пользователь жмет "Cancel", то завершать все вычисления. Тут я планирую использовать QFutureWatcher::cancel(), однако тут тоже не понятно. Если внутри функции будет бесконечный или очень долгий цикл, сработает ли cancel()?

Каша в голове из-за обилия методов передачи указателя на мою функции или метод класса. Для начала мне нужно передать некий список с задачами, причем в задаче должен быть не один параметр. Значит придется использовать QList<QPair <int, int> > для передачи диапозонов в метод вычисления. Методы типа QtConcurrent::run(), QtConcurrent::*Reduced(), QtConcurrent::*filtered() исключаются. Первый из-за невозможности прерывания, второй из-за того, что запускается только один поток, третий из-за удаления элементов из списка при возвращении true функцией (этот функционал мне не нужен). Значит остаются QtConcurrent::map и QtConcurrent::mapped(). Из-за скудного описания я не понимаю как они работают. Эти методы блокирующие или нет?

Далее насчет прогресса. Я так понял метод типа QFutureWatcher::progressValue () может мне возвратить только 2 значения: 50% и 100%, т.к. ядра 2 и потоков тоже 2. Меня это не устраивает, мне нужен реальный ход прогресса, который бы вычислялся на основе текущих значений переменной i во всех потоках. Т.е. если один поток на стадии цикла 5 из диапозона 0-10, а второй поток на стадии выполнения 2 из диапозона 11-20, то 2+5=8 - общий ход выполнения. Таким образом мне нужен механизм для влияния на QProgressDialog. Отсюда всплывают сигналы и слоты. Значит мои потоки должны уметь испускать сигналы. Стало быть список для QtConcurrent::map должен быть какой-то такой QList<QObject *>, а раз ядра 2, то и объектов в списке будет 2. Придется завести сигнал типа step(), который подключить к QProgressDialog, таким образом шквал этих сигналов от разных потоков заставит полосочку бежать вперед. Затем нужно будет завести сигнал типа finish(), чтобы мои объекты могли останавливать ход просчета на середине, если один из потоков нашел искомую комбинацию. И эту комбинацию (результат) еще надо будет как-то вернуть обратно в основной поток.

В общем всё довольно сложно, может будут какие-то идеи?
---
Похоже я начал вникать потихоньку. В QtCreator'e везде используется QtConcurrent::run(), причем внутри QObject'ов, в метод передается указатель this и ссылка на метод этого класса. И мне похоже надо будет создать каркас класса унаследовав QObject и создать количество экземпляров типа Task равное количеству процессоров, после чего в итерации запустить на каждом метод типа QtConcurrent::run().
---
Разработчики QtCreator'а злыдни. Используют не документированный класс QFutureInterface<> для установки прогресса и результата потока. А простые пользователи библиотеки значит должны голову ломать...
azure,
17.12.2009, 15:59 Отображение rtf документов в QTextEdit
В Qt RTF это не документы с расширением .rtf. Т.ч. нельзя.
XXL,
14.12.2009, 23:24 Выпущен Qt Declarative для Qt 4.6.0
Метод установки для MinGW (в README о нем ничего):

Распаковываем архив с исходниками QtDeclarative в любое место.
Запускаем консоль с подготовленным окружением и затем заходим в папку с распакованными исходниками, находим файл declarative.pro и редактируем его в текстовом редакторе, добавляем в конец файла следующую строчку:

*-g++*: CONFIG += create_prl
Если этого не сделать, то не будут сгенерены .prl файлы и будет невозможным собрать утилиту qmlviewer или вообще любую другую программу, которая будет использовать QtDeclarative модуль.

после чего заходим в подпапку src/declarative :
cd src\declarative

Формируем Makefile'ы:
qmake

Собираем:
mingw32-make all
Вместо all можно собирать declarative 2 раза, по умолчанию он собирается в debug сборке, если указать mingw32-make release, то еще и в релизе.

Устанавливаем QtDeclarative в исходники Qt.
mingw32-make install

Директивой install ставится только debug версия поэтому, чтобы установить еще и release версии .dll'ок надо скопировать следующие файлы вручную:
qt-4.6.0-declarative\src\declarative\.obj\QtDeclarative4.dll -> qt-everywhere-opensource-src-4.6.0\bin\
qt-4.6.0-declarative\src\declarative\.obj\libQtDeclarative4.a -> qt-everywhere-opensource-src-4.6.0\lib\
qt-4.6.0-declarative\src\declarative\.obj\QtDeclarative.prl -> qt-everywhere-opensource-src-4.6.0\lib\
qt-4.6.0-declarative\src\declarative\.obj\QtDeclaratived.prl -> qt-everywhere-opensource-src-4.6.0\lib\

Затем копируем хедеры QtDeclarative в папку с исходниками Qt:
xcopy /E /Y ..\..\include\QtDeclarative %QTDIR%\include\QtDeclarative


Собираем qmlviewer:
cd ..\..\tools\qmlviewer
qmake
mingw32-make release


Далее возвращаемся на 2 директории назад, ищем папку bin и копируем утилиту:
qt-4.6.0-declarative\bin\qmlviewer.exe -> qt-everywhere-opensource-src-4.6.0\bin\

Затем можно запустить утилиту, зайти, скажем, в папку qt-4.6.0-declarative/demos/declarative/calculator и выбрать calculator.qml. Лично я при выходе из утилиты qmlviewer получил краш.

Затем попробуем собрать демку minehunt, в ней используется и C++ тоже:
cd /demos/declarative/minehunt
qmake
mingw32-make release
release\minehunt.exe


Запускается, работает и даже не упала.

К сожалению мне так и не удалось заставить работать QtDeclarative в связке с QtCreator'ом. А именно запускать на выполнение .qml проекты, всегда получаю:
Starting ...
The process could not be started!


Я не знаю какой процесс он пытается запустить и что ему для этого нужно. Вижу, что в исходниках QtDeclarative многое подготовлено для внедрения в Qt, вроде бы есть генератор документации, но это всего лишь .pri файл, который нигде не используется, вроде бы есть qml дебаггер как плагин к QtCreator'у.

К сожалению, после мучений со сборкой у меня отпало всякое желание разбираться с QML до тех пор, пока его официально не внедрят в следующую версию Qt, пока он не начнет собираться без проблем наряду с другими модулями Qt.
Litkevich Yuriy,
12.12.2009, 23:08 [РЕШЕНО] JPG Qt
Цитата(mycoding @ 12.12.2009, 22:53) *
Уже не первый раз обращаю внимание, что программа в которой есть рисунок не png, а например
jpeg, на других компах не отображается, нужно обязательно ставить Qt....
Подскажите в чём дело ...

Плагин таскать надо с программой qjpeg4.dll и поместить его в отдельную папочку рядом с .exe файлом: plugins\imageformats
mycoding,
12.12.2009, 23:04 QTextEdit
Цитата(&-rey @ 12.12.2009, 22:28) *
Есть ли смысл написать в support ?


Судя по тому, что я сегодня читал эта проблема была еще известна в 2005 году и даже в Qt3. Плюс в багтрекере уже есть подобные репорты. Но лучше написать еще раз, напомнить им о проблеме. Кстати это касается также и QTableWidget/QListWidget/QTreeWidget (*View классов тоже). И та же проблема с QPixmap, QImage (очень большую картинку хрен загрузишь, карту например). Т.е. в Qt мало чего сделали для того, чтобы интерфейс мог работать с большими объемами данных. С обычными контейнерами (QVector, QList) та же история, свои аллокаторы пишут к stl контейнерам.

SendMessage(edit->Handle, EM_REPLACESEL, 0, (long)Stream->Memory);


Это вроде как вообще к борману мало относится, тут же чистый WinAPI.
&-rey,
12.12.2009, 9:36 QWebView, проблемы идентификации
Если это часть какой-то защиты сервера, то просто замени JavaScript приходящий от сервака на свой код и отправляй другую строку.
ufna,

7 страниц V  < 1 2 3 4 > » 
RSS Текстовая версия Сейчас: 25.4.2024, 14:01