About Blog PGP Key

All articles, tagged with “qt”

Qt User Survey winners

Примерно в апреле Nokia проводила опрос разработчиков, использующих Qt. Не помню точно, откуда я узнал про него. Кажется пришло письмо на мыло, на которое закреплена рабочая коммерческая лицензия. Ради интереса опрос я заполнил.

С неделю назад пришло письмо вида:

Subject: Congratulations! Qt User Survey Winner
From: Qt.Comments@nokia.com
To: Qt.Comments@nokia.com
Date: Mon, 21 Jun 2010 16:21:24 +0200

Hello!

Congratulations! You are one of the lucky Qt User Survey raffle winners!

Please be so kind to reply to this mail with your full mailing address
to receive your shiny N900 phone in your mailbox.

Please note that there is a backorder on the N900s, so please
anticipate a slight delay in receiving your phone.

Also, note that we will be posting a blog piece announcing the winners
on the Qt Blog. If you would not like your name posted on our blog, please let
us know as soon as possible.

Thanks and regards, The Qt Team

В общем, теперь победителей, кто получает в подарок Nokia N900, обьявили публично

Qt, MySQL

Понадобилась мне мелкая Qt-ная апликуха, которая бы умела выгребать данные из MySQL базы. Наступил на какие-то непонятные грабли.

Вот такой вот запрос работает:

SELECT COUNT(*) FROM table;

Возвращается 807 — количество записей. А вот такой запрос возвращает по какой-то причине всего 37 записей:

SELECT * FROM table;

Путем добавления всяких ORDERED BY и LIMIT/OFFSET удалось подобрать запись, на которой всё стопается. Вот такой вот запрос не возвращает ничего:

SELECT * FROM table WHERE id=1234

(Запись с id = 1234 существует). Дальше пришло в голову вот такое:

SELECT COUNT(*) FROM (SELECT * FROM table WHERE id=1234) as tbl;

Такой запрос вернул цифру “1”. То есть запись на самом деле есть.

Дальше я взял в руки GDB и начал дебажиться по libqt4-sql-mysql. За несколько проходов понять ничего не вышло. Потом я увидел следующий код ($QTDIR/sql/drivers/mysql/qsql_mysql.cpp, конец функции bool QMYSQLDriver::open()):

#if MYSQL_VERSION_ID >= 40108
    d->preparedQuerysEnabled = mysql_get_client_version() >= 40108
                        && mysql_get_server_version(d->mysql) >= 40100;
#else
    d->preparedQuerysEnabled = false;
#endif

Ну я, подумав что не зря для каких-то версий мускуля Prepared запросы отключали, вырубил их нафиг и пересобрал либу. После этого всё заработало.

Выглядит это всё очень странно. Command Line клиент пользуется обычными Query без Prepare/Execute.

PS. Qt 4.5.1.

Remote X11

Попробовал я короче говоря запустить Qt4-апликуху на удаленном X дисплее. Выглядело это всё очень грустно. Окошко отрисовывается по 5 секунд.

В качестве спортивного интереса позапускал различный софт, который использует разные тулкиты. Результат очень даже удивил (упорядочено по скорости работы GUI):

  1. xcalc
  2. tkabber
  3. Java (Swing)
  4. Wine с запущеным обычным инсталлером
  5. Qt3
  6. GTK2
  7. Qt4

C xcalc все понятно. Он использует xlib напрямую. Tk рисует всё тоже весьма оптимально (хотя и помедленней).

Swing, который я всегда считал тормозом, работает на удивлени быстро. По скорости в принципе не отличить от Tk.

Почему wine оказался _заметно_ быстрей новомодных GTK/Qt я вообше не понимаю. Суть в том, что если вендовой аппликухой, запущенной в wine, можно пользоваться, то софтом, использующим Qt3/GTK2/Qt4 — вообще невозможно.

Падение Qt3 -> Qt4 — это вообще регрессия офигеть какая. Может на локальных дисплеях оно и быстрей стало, но по сети Qt4 — тормоз.

Походу на сетевые фичи иксов все тупо забивают. Собственно скоро X11 вообще будет ненужным. К сожалению.

Qt4, X11

“But hey, this means we have tons of XPutImage calls as part of the repainting, doesn’t it?” you are probably thinking. Luckily not… The raster graphics system is using the X Shared Memory extension to allocate the bits shared with an XPixmap so the end of a paint is a mere XCopyArea, which happens in-place on the X server, so it is quite cheap. Needless to say this is a solution that works best on local displays, but that does cover most of the Linux desktops out there, so it should be a gain in general.

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

About remote connections with X11, I use the NX (http://www.nomachine.com/) improved protocol. I found Qt4 really slower than Qt3 through NX/FreeNX (In fact, at office, we use a big Linux server with KDE 3.5 and remote clients with NXclient and after some tests, KDE 4 seemed unusable).

QSortFilterProxyModel

Есть такая вот вроде достаточно простая вещь, но реализовать её не получается. Есть рабочий Model, который представляет собой одноколоночное дерево, содержащее два типа узлов: каталог и файл:

Folder1
  File1.1
  File1.2
Folder2
  File2.1
  File2.2
Folder3
  Folder3.1
    File3.1.1

Есть фильтр, согласно которому хочется скрывать некоторые файлы (например, по имени). Также нужно скрывать “пустые” каталоги. Каталог считается пустым, если в нем нет файлов, которые пропускает фильтр.

Вроде всё просто. Отсабклассить QSortFilterProxyModel и реализовать filterAcceptsRow(). Проблемы начинаются, когда файлы могут “переименовываться” в оригинальной модели на лету. Модель корректно шлет dataChanged(). Во всяком случае вьюшка изменения показывает правильно. Смысл в том, что изменение изначально отфильтрованного “File3.1.1” может повлечь за собой то, что он уже будет пропускаться фильтром. Тогда ранее скрытый Folder3.1 нужно отобразить. И так по цепочке “Folder3”…

dataChanged() нужно говорить два ModelIndex-а: TopLeft и BottomRight (на одной ветке). Теоретически должно быть достаточно сказать dataChanged(Folder3, File3.1.1) или даже dataChanged(root, File3.1.1) но оно не работает. QSortFilterProxyModel не хочет перепроверить нужные узлы. Соответственно во вьюшке ничего не появляется.

Единственственное, что работает — дергать dataChanged() персонально для каждого узла в дереве от Folder3 и до File3.1.1. Но оно тормозит.

C интересом провел уже второй вечер =)

WolfenQt

Qt4 Model/View

Целый день провозился с Qt-ным MVC. Пытался наследовать QAbstractItemModel и нотифаить View про добавление/удаление узлов в дереве. Наловил кучу сегфолтов в момент удаления узлов.

Постепенно уменьшал количество кода. Свелось все к тому, что QTreeView-у становится плохо, если в модель вставляется узел в _первую_ строку…

Дебажил, дебажил.. В итоге вылечилось все с помощью aptitude dist-upgrade. Qt4 обновился с 4.4.0 на 4.4.3.

PS. В Qt labs есть интересный класс, который позволяет находить многи ошибки в реализации моделей.

Странное поведение Qt4

Запускаю qtconfig-qt4. Нажимаю кнопку «Tune palette». Для «Base» выбираю не белый цвет, а чуть темней (не хочу слишком ярких цветов). Нажимаю сохранить. В этом qtconfig изменения моментально применились. Также изменения применились в рядом запущенном Psi. Перезапускаю Psi, цвет опять стал ярко белым… Открываю qtconfig снова, там изменений тоже нет…

Без KDE4 точно работало… Связи не вижу…

KDE 4.1: первый день

Ковыряемся. KHotkeys скорее мертв, чем жив. Заставить его работать у меня не вышло. KWin-у нельзя повесить на одно действие более нескольких хоткеев (в 3.x было можно). Также пропала возможность повесить хоткей на переключение к следующему и предыдущему окну (в порядке отображения в таскбаре, а не между последними окнами, как по Alt+Tab).

Запуск терминала по Win+K повесил с помощью xbindkeys.

После запуска Openoffice плазму начинает очень сильно колбасить. Она странно перерисовывается.

Композитные эффекты выключил нафиг, ибо только мешают. Порадовал gtk-qt-engine-kde4 своей безглючностью. Плазма за это время ни разу не упала. Что даже странно.

В целом жить пока можно :)

KDE 4.1 Release

Поставил себе релиз. Предварительно снес libqt3-mt, чтобы гарантированно не осталось ничего от KDE3. Ставил на реальное железо (ноут с GeForce Go 7400).

Первое, что бросается в глаза — стабильность. За час-полтора работы ни разу ничего не упало. Имеющийся функционал работает достаточно стабильно. Обрадовало, что kwallet умеет читать пароли из бумажника KDE3.

Тем не менее, недостатки бросаются в глаза.

 continue reading