![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
void* |
![]()
Сообщение
#1
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Предлагаю в данную тему скидывать все известные вам интересные фичи и "секреты" Qt. Думаю, так можно собрать неплохую коллекцию интересных возможностей Qt, где каждый сможет найти что-нибудь интересное для себя или узнать новое. Начну сам:
1) Макрос Q_UNUSED позволяет избежать предупреждений по поводу неиспользования какой-то переменной. Пример:
2) Функция QString Qt::escape(const QString &plain) позволяет конвертировать в строке, задаваемую параметром plain метасимволы HTML (<, >, &) в их HTML-эквиваленты. Пример:
3) Макрос Q_PROPERTY позволяет в некоторых случаях избежать приведения. Пример:
to be continued... P.S. Надеюсь тема не умрет, и каждый будет ее поддерживать своими находками ![]() ----------------------- Ссылки на интересные возможности: 1) QComboBox-Изменение размера выпадающего списка 2) qmake, как обратится к текущему каталогу? Сообщение отредактировал Litkevich Yuriy - 31.1.2009, 12:52 |
|
|
![]() |
AD |
![]()
Сообщение
#2
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
P.S. Мне кажется тему можно вверху прикрепить!
![]() Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile:
В данном коде, тип _str - это пользовательский тип. В функциях read/write считываются в эту структуру данные указанного типа при преобразовании в const char*, а не в void*! |
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
void*, для 1-го пункта часто имя переменной коментируют, чтоб компиллер не ругался:
|
|
|
void* |
![]()
Сообщение
#4
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
LitkevichВ Yuriy, приколупался
![]() ![]() |
|
|
Tonal |
![]()
Сообщение
#5
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile: Оно вполне обычное - сохранение буфера. Но мне кажется, код у тебя не правильный. Если сохранение/восстановление происходят в разных программах, или даже при разных запусках одной программы, в поле strOut.s с большой вероятностью будет мусор. Сообщение отредактировал Tonal - 24.7.2008, 10:17 |
|
|
AD |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Оно вполне обычное - сохранение буфера. Но мне кажется, код у тебя не правильный. Если сохранение/восстановление происходят в разных программах, или даже при разных запусках одной программы, в поле strOut.s с большой вероятностью будет мусор. не совсем понял почему неправильный. Но он исправно работает. Проверял на нескольких машинах! ![]() |
|
|
ЙаМайскЫйПчОЛ |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile: Это обычно для программирования под *nix'ы read/write можно применить для любого дескриптора, в т.ч. для дескриптора файла, а файл в *nix'ах это всё что есть и может быть в системе. ))) |
|
|
Tonal |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
...в поле strOut.s с большой вероятностью будет мусор. не совсем понял почему неправильный. Но он исправно работает. Проверял на нескольких машинах! ![]() 1) Как объявлено поле _str.s? Как char* ? 2) На что указывает поле strIn.s перед сохранением (где живёт массив символов)? 3) Как ты думаешь, что именно сохраняется в файле на месте соответствующем полю _str.s? 4) Что будет находится в поле strOut.s после чтения? 5) Куда будет указывать поле strOut.s в другой программе? Или в этой же, если выполнится например вот такой код:
P.S. В своём первом посте, ты strOut и strIn местами не перепутал? ![]() P.P.S Если я ошибся в первом предположении, и поле _str.s имеет тип строки (QString, или std::string, или ещё какой), задумайся, как он устроен, и где хранятся те символы, которые представляют строку. Сообщение отредактировал Tonal - 24.7.2008, 11:50 |
|
|
void* |
![]()
Сообщение
#9
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Собственно продолжение. Простенький пример того, что можно сделать с помощью Qt Style Sheets. Скомпилируйте это у себя и зацените кнопочку:
думаю вам понравится ![]() Сообщение отредактировал void* - 25.7.2008, 23:27 |
|
|
Петров Виталий |
![]()
Сообщение
#10
|
Студент ![]() Группа: Участник Сообщений: 29 Регистрация: 8.1.2008 Пользователь №: 63 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Тоже поделюсь парой интересных моментов.
1) Если вы не используете потоки. но при этом имеется к примеру большой цикл, то интерфейс приложения может блокироваться и не перерисовывается. Чтобы решить эту проблему можно вызывать метод QApplication::processEvents(); при каждой итерации цикла. 2) Сделать фон любого виджета прозрачным можно так: listwidget->setFrameShape(QFrame::NoFrame); listwidget->viewport()->setAutoFillBackground(false); это может пригодится например, если вы пишете плазмоид для kde4 а в плазме пока нет некоторых нативных прозрачных виджетов =))) |
|
|
void* |
![]()
Сообщение
#11
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
также можно регулировать прозрачность любого окошка с помощью метода QWidget::setWindowOpacity(), который принимает в качестве параметра вещественное число, где 1.0 - полная непрозрачность, а 0.0 - полная прозрачность. Соответственно по умолчанию это значение является равным 1.0
|
|
|
kwisp |
![]()
Сообщение
#12
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
всем привет.
может я собираюсь написать об очевидной штуке, но однако меня она удивила. 1. если соединить один и тот же сигнал с одним и тем же слотом несколько раз(n), и вызвать сигнал один раз, то слот вызовется столько раз сколько соединений с этим сигналом мы сделали(n) ![]() 2. если разъединить сигнал со слотом - то рушатся все соединения этого сигнала с этим слотом. ... известен ли кому нибудь метод узнать соединен ли сигнал со слотом и если соединен то сколько раз??? |
|
|
kwisp |
![]()
Сообщение
#13
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, та ни ма за шо.
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
... известен ли кому нибудь метод узнать соединен ли сигнал со слотом и если соединен то сколько раз??? сообщения перенес в отдельную тему: Есть ли метод, чтобы узнать соединен ли сигнал со слотом?
|
|
|
SABROG |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Использовать QLatin1String вместо QString где это возможно, т.к. первый быстрее.
QString - конвертирует копирует и конвертирует ASCII строку в Unicode каждый раз, когда ему передается строка в конструкторе. QLatin1String - класс-обертка над Си строкой (char *). Строка никуда не копируется, поэтому программист должен сам следить за ней. Имеет смысл использовать отдельно от визуальных компонентов, там где не нужна интернационализация. |
|
|
molchanoviv |
![]()
Сообщение
#16
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
Только прирост этот будет незаметен. Так зачем этот геморой?
|
|
|
SABROG |
![]()
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Только прирост этот будет незаметен. Так зачем этот геморой? Это смотря какая специфика приложения. Если предположить, что есть большой QList с такими строками и строки тоже не маленькие, а в приложении используется меньшая часть списка, то зачем конвертировать весь список сразу ? И экономия процессора и памяти, все-таки Unicode не однобайтовая кодировка. Вопрос. Как редактировать свои посты, а то опечатки вылазят ![]() |
|
|
SABROG |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
К теме о сигналах. Бывают случаи, когда надо испустить сигнал внутри обработчика событий, но подобное не работает, т.к. это может привести к зацикливанию и Qt блокирует такие сигналы. В метод connect можно передать дополнительный флаг Qt::QueuedConnection, что говорит Qt вызвать слот для сигнала при следующем цикле QEventLoop (т.е. после выхода из обработчика событий или метода). Такой прием обычно используется для помещения приложения в tray через кнопку minimize.
|
|
|
SABROG |
![]()
Сообщение
#19
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В Qt есть возможность использовать системные иконки (разные для каждой ОС, определяются динамически). К сожалению в QtDesigner'e почему-то такой возможности нет и подобный метод рассчитан на ручную простановку иконок для каждого элемента. Поможет в этом метод QStyle::standardIcon(). Доступ к методу можно получить через указатель qApp->style()->standardIcon(...);
Выбор иконок не велик, но некоторые могут пригодится: http://doc.trolltech.com/main-snapshot/qst...dardPixmap-enum |
|
|
SABROG |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В Qt можно соединять не только сигнал со слотом, но и сигнал с сигналом. Это приведет к тому, что сигнал запустит второй сигнал. При этом если первый и второй сигналы были подключены к слотам, то они тоже вызываются (естественно, если на нем что-то завязано, сигнал типа clicked() врятли кликнет на кнопку).
|
|
|
Admin |
![]()
Сообщение
#21
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
Треп перенесен в тему Треп из темы Секреты и интересные возможности Qt.
Так как он всеже не изкореним в этой теме, то весь треп будет всегда переносится в ту тему... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#22
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
обнаружил интересное поведение в QTableView
если выделена ячейка в столбце N, то нажимая кнопки букв или цифр на клавиатуре будет осуществлятся навигация по этому столбцу. например есть таблица:
если выделим ячейку с RefDes=C17, а затем будем нажимать кнопку "F", то выделение и фокус перейдет сначала на FU1, а при последующих нажатиях на FU2, FU3. Затем все повторится с начала. |
|
|
SABROG |
![]()
Сообщение
#23
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Не знаю куда это отнести к секретам или интересным возможностям. Вроде и не секрет, да и не возможность. А просто любопытная информация мимо которой многие могли бы пройти. Дерево классов Qt 4.3, распечатать и повесить на стенку. В ассистенте его нет, т.к. оно в PDF формате: http://doc.trolltech.com/extras/qt43-class-chart.pdf
|
|
|
Константин |
![]()
Сообщение
#24
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 9.2.2009 Пользователь №: 539 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
ну и секреты у вас
![]() но всё-равно внесу свои пять копеек: если в кастомном виджете в paintEvent используется `setOpacity(a)` для активного Q(|Style)Painter, где `a<1.0` (например, эффект плавного показа/скрытия виджета), и у виджета имеется родитель, то соседи родителя получат такой же фактор прозрачности через /* кривую */ групповую прозрачность. чтобы этого избежать, необходимо использовать сохранение/восстановление состояния QPainter:
вышесказанное верно для Qt < 4.5, в 4.5 групповая прозрачность забыта, как страшный сон... Сообщение отредактировал Константин - 13.2.2009, 5:43 |
|
|
Admin |
![]()
Сообщение
#25
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
Перенес обсуждение не относящееся к данной теме в тему: QAction::activated()[signal]
|
|
|
SABROG |
![]()
Сообщение
#26
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Еще один способ вывода отладочных сообщений для GUI приложений. Позволяет не прописывать CONFIG += console в .pro файле.
На qDebug, qWarning, QFatal будет всплывать диалог, вместо того, чтобы писаться в консоль.
![]() |
|
|
CrackedMind |
![]()
Сообщение
#27
|
Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 13.3.2009 Пользователь №: 611 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Вообще этого будет более чем достаточно
Цитата QErrorMessage::qtHandler(); // т.к. статический метод
|
|
|
BRE |
![]()
Сообщение
#28
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Еще один способ вывода отладочных сообщений для GUI приложений. Позволяет не прописывать CONFIG += console в .pro файле. На qDebug, qWarning, QFatal будет всплывать диалог, вместо того, чтобы писаться в консоль. А еще можно перехватить весь вывод и писать его в лог-файлы, например. QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler ) В документации есть пример использования. В проекте freeremote, я все строки добавляю в QStringListModel, что дает возможность в необходимых местах сделать просмотр лога, просто создав QListView и указав эту модель в качестве активной. |
|
|
SABROG |
![]()
Сообщение
#29
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Добавлю метод альтернативный методу QTimer::singleShot(), чтобы выполнить слот при возврате в главный event loop, т.е. после выхода из метода.
Этот код помещает в очередь событий информацию о том, что надо вызвать наш слот. Эквивалентно emit signalName с connection type Qt::QueuedConnection. В принципе таким методом можно и сигналы симулировать. |
|
|
SABROG |
![]()
Сообщение
#30
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Пожалуй вопрос с enum'ом сюда помещу. В общем задача - получить название перечисляемого типа по значению. Решение вопроса в стиле Qt
![]()
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#31
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#32
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Немножко заморочился на тему создания и извлечения zip архивов средствами Qt. Посмотреть что из этого вышло можно тут http://vingrad.ru/blogs/sabrog/2009/03/20/...s-zip-arhivami/
|
|
|
AD |
![]()
Сообщение
#33
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, напиши, пожалуйста, тут о тех двух функциях-то!
![]() |
|
|
SABROG |
![]()
Сообщение
#34
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, напиши, пожалуйста, тут о тех двух функциях-то! ![]() В Qt 4.5 если классы, которые используются для поддержки Open Document Format, среди них есть классы для работы с .zip архивами. В документации о них не слова и классы по сути только для внутреннего использования. Нас интересуют классы QZipReader и QZipWriter. Чтобы можно было их использовать надо: - в .pro файле добавить это:
- в хедеры прописать пути:
Использовать так: //распаковка архивов
С сжатием сложнее, но принцип такой:
Сообщение отредактировал SABROG - 20.3.2009, 15:27 |
|
|
AD |
![]()
Сообщение
#35
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
![]() |
|
|
SABROG |
![]()
Сообщение
#36
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В Qt есть недокументированные кроссплатформменные функции qgetenv() и qputenv() для получения и установки переменных окружения.
Описаны в <QtCore/QtGlobal> Использовать на свой страх и риск. Сообщение отредактировал SABROG - 20.3.2009, 17:15 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#37
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]() ![]()
Сообщение
#38
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
![]() Для тех кто помешан на обезжиривании Qt. Вместе с исходниками Qt для мобильных систем поставляется утилита QConfig, которая позволяет отключать возможности (features). ![]() При этом утилита сама смотрит за зависимостями и отключает зависимые компоненты. Дистрибутивы для win и *nix идут без этой утилиты. Поэтому, чтобы воспользоваться данной утилитой нам понадобится скачать общий дистрибутив Qt для всех платформ. Сделать это можно в .torrent репозитории http://dist.trolltech.com/torrents/ Качать надо это: http://dist.trolltech.com/torrents/qt-all-...5.0.zip.torrent Сразу скажу, что у меня уже стояла Qt собранная статически, поэтому я просто зашел в папку $(QTDIR)/tools/qconfig и вбил заветные команды:
После этого я получил в папке release готовую утилиту. Я её залил сюда (3Mb): http://filebeam.com/b143c6b3d9bb05976e6ab1ea2fed7756 Далее запускаем её, не важно откуда. Появится диалог выбора файла. Надо выбрать файл $(QTDIR)/src/corelib/global/qfeatures.txt Затем снимаем галки, которые нам не нужны и сохраняем в файл $(QTDIR)/src/corelib/global/qconfig-НАШЕИМЯ.h Расположение и имя файла должно быть именно таким иначе он не найдется. Затем используем не документированный для виндовых/линуксовых дистрибутивов, но существующий ключ -qconfig таким образом:
Дальше собираем как обычно. В аттаче я прикрепил свою конфигурацию, не уверен, что она оптимальная или правильная. Проверил на примере /examples/widgets/calculator. В обычном статике размер: 7,14 МБ (7 494 656 байт) C теми же ключами но после редактирования через qconfig: 6,19 МБ (6 496 256 байт) UPX сжал exe файл до : 2,34 МБ (2 463 232 байт) Для сравнения обычная (shared) сборка, сумма всех файлов в папке: 13,1 МБ (13 779 036 байт) --- Я пошел дальше в своих изысканиях и решил собрать Qt с оптимизацией по размеру. Отредактировал файл $QTDIR/mkspecs/win32-g++/qmake.conf и заменил строчку: Цитата QMAKE_CFLAGS_RELEASE = -O2 на Цитата QMAKE_CFLAGS_RELEASE = -Os Проделал ту же операцию, что и раньше. Теперь пример calculator.exe сжатый UPX'ом весит: 1,99 МБ (2 095 104 байт) Хоть и в ущерб скорости (оптимизация убрала выравнивание страниц), зато в пользу размера. Еще бы, есть разница 13Мб и 1,99Мб ![]() --- Немного погуглив нашел еще пару ключей для компилятора, которые прописал тоже в qmake.conf Цитата -fmerge-all-constants -fno-default-inline -fno-inline -ffunction-sections -fdata-sections -Wl,--gc-sections Новый рекорд: 1,86 МБ (1 951 744 байт) Но есть побочный эффект. Простейшие примеры линкуются около минуты. В общем экспериментируйте. Сообщение отредактировал SABROG - 22.3.2009, 20:59 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#39
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
любопытно
|
|
|
SABROG |
![]()
Сообщение
#40
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#41
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Тянет на статью в wiki.
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#42
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
CrackedMind |
![]()
Сообщение
#43
|
Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 13.3.2009 Пользователь №: 611 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Лишь одно скажу. Если конфигурировать сразу так без предварительной компиляции
Цитата configure -qconfig нашеимя то утилиты не будут собираться, будет требовать dist-config Если задефайнить QT_NO_SESSION_MANAGER то опять же сборка не пройдет. По крайней мере на каком-то снэпшоте 4.5 точно так было, починили ли они это в релизе без понятия. Да и зависимости там бывают странные. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#44
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Эх, как бы всё это разгрести. Я уже несколько раз порывался. Но как только начну рисовать набумажке, что и куда, так волосы на голове начинают шевелиться.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#45
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ковырялся с документацией Qt 4.6 и сделал для себя открытие:
Оказвается в Qt 4.4 был введен новый класс компоновки QFormLayout А его презентация появилась только в 4.5. на странице описания компоновок |
|
|
CrackedMind |
![]()
Сообщение
#46
|
Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 13.3.2009 Пользователь №: 611 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
А кто-нибудь обратил внимание, что в 4.5 появились смарт-пойнтеры? Классы QSharedPointer & QWeakPointer.
|
|
|
Sokoloff |
![]()
Сообщение
#47
|
Участник ![]() ![]() Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: ![]() ![]() ![]() |
Обнаружил тут, что QImage умеет читать postscript файлы. Обнаружил случайно, смотрел пример из qt4/examples/widgets/imageviewer и вместо png файла кликнул на ps, и был нескозанно удивлен увидев что программа показала его.
На windows у меня не заработало (мо возможно нужно что-то доставить/настроить), но на kubunt-e 9.04 с QT 4.5.0 и ghostscript работает. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#48
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Sokoloff |
![]()
Сообщение
#49
|
Участник ![]() ![]() Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: ![]() ![]() ![]() |
Ghostgum Я ставил вот это http://pages.cs.wisc.edu/~ghost/doc/GPL/gpl864.htm но результата нет. Впрочем, мне по windows и не надо. |
|
|
SABROG |
![]()
Сообщение
#50
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Думаю никто не будет против, если я буду использовать эту тему немного не по назначению? А именно как закладки, в каком-то смысле, чтобы не потерять.
_________ В документации по сигналам и слотам есть такая фраза: Цитата If several slots are connected to one signal, the slots will be executed one after the other, in an arbitrary order, when the signal is emitted. Которая дает нам понять, что один сигнал подключенный к нескольким слотам не дает гарантии того, что эти слоты будут вызываться в порадке подключения сигналов. А именно в произвольном порядке. Изучив немного посты в mailist'e trolltech я вынесл для себя следующую мысль. На данный момент порядок вызовов слотов можно предсказать, однако разработчики не дают гарантии того, что в новых версиях библиотеки порядок вызовов не изменится. Может быть вариант, когда вызовы будут сортироваться для достижения максимальной производительности. Поэтому, если нужен строгий порядок вызовов слотов по одному сигналу можно воспользоваться этим каркасом:
_________ А это уже на память мне, если захочу вспомнить как надо инициализировать seed перед использованием qrand:
Сообщение отредактировал SABROG - 9.5.2009, 10:02 |
|
|
SABROG |
![]()
Сообщение
#51
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Немного про нормализацию сигнатур. Мое внимание привлекло требование о необходимости нормализовывать все сигнатуры прежде чем использовать connect при изменении исходников Qt.
Нормализация представляет собой парсинг строки, уменьшение её длинны путем удаления лишних пробельных символов. Перестановка ключевых слов для оптимизации поиска нужного сигнала или слота у QObject'a. Подобный разбор происходит каждый раз, когда мы используем connect. Макросы SIGNAL() и SLOT() не дают нам нормализованную строку, они нам дают просто строку типа:
После нормализации (QObject::normalizeSignature()) видно, что один пробел пропал:
И т.п. В составе Qt появилась утилита /util/normalize, она пробегается по исходникам и заменяет макросы SIGNAL()/SLOT() на нормализованные сигнатуры, что сказывается на скорости соединения сигналов и слотов. Вероятно, в программах, где идет постоянное соединение/разъединение это помогло бы немного выйграть в скорости. P.S.: однако мне не понятно, почему тролли не изменили moc компилятор таким образом, чтобы это делалось всегда на автомате. Сообщение отредактировал SABROG - 20.6.2009, 16:59 |
|
|
SABROG |
![]()
Сообщение
#52
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Пользователи Qt, которые собирают свои приложения с помощью компилятора gcc наверняка замечали, что при компиляции их приложений используется ключ оптимизации -O2. В первую очередь это связано с тем, что сама библиотека Qt собранная с ключем оптимизации -O3 ведет себя не стабильно. Однако никто вам не запрещает иметь библиотеку Qt собранную с оптимизацией -O2, а вашу программу с оптимизацией -O3 или любой другой. Однако ключи компилятора прописаны в одном из spec файлов. К тому же не удобно каждый раз лезть в исходники Qt и что-то там менять глобально для всех приложений. Я нашел несколько иной выход, это замена ключей компилятора на свои прямо в .pro файле:
Таким образом наша программа может быть собрана с максимальной оптимизацией, нужно лишь изменить значение переменной OPTIMIZE. К тому же это может быть полезным на этапе проектирования приложения. В больших проектах release сборка может собираться десятками минут. Конечно можно собирать только debug, но случаи бывают разными. Поэтому, чтобы уменьшить время компиляции релизных сборок можно отключить для них оптимизацию совсем (OPTIMIZE += 0). Когда, по мнению автора, программа будет готова к выпуску в свет - оптимизацию можно включить обратно. И конечно никто вам не запрещает на свой страх использовать тонкую настройку под разные платформы:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#53
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
-O3 на самом деле не макисальная, а альтернативная оптимизация, и может существенно проигрывать -O2, это и в руководстве по GCC написано и по моей практике так.
Есть ещё -Os - оптимизация по размеру, жмёт основательно, я в контроллерах такую использую. |
|
|
AD |
![]()
Сообщение
#54
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
0x - полная автоматизация. Ее ведь тоже можно использовать?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#55
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#56
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
trdm |
![]()
Сообщение
#57
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Не такая уж и опечатка,
![]() ![]() автоматизация в некоторых случаях дает оптимизацю ![]() |
|
|
AD |
![]()
Сообщение
#58
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Не такая уж и опечатка, ![]() ![]() автоматизация в некоторых случаях дает оптимизацю ![]() ![]() ![]() |
|
|
SABROG |
![]()
Сообщение
#59
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
__fastcall в стиле Qt. В Delphi и MSVC есть аттрибут для функций __fastcall, который позволяет вызывать функции быстрее, т.к. при передаче параметров используются регистры eax, edx и ecx. К сожалению в связи с этим есть некоторые ограничения. Параметров может быть 3 и все они должны иметь целочисленный тип (4 байта). Например:
Чтобы использовать макрос QT_FASTCALL нужно подключить заголовок:
Само объявление макроса выглядит так:
Сообщение отредактировал SABROG - 6.7.2009, 14:53 |
|
|
SergSh |
![]()
Сообщение
#60
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 27.8.2009 Пользователь №: 1024 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
QListView при инициализации считывает все строки для определения размеров.
На больших наборах данных это очень существенные затраты времени. Чтобы этого не происходило достаточно воспользоваться setGridSize(). Правда у меня осталась другая проблема - предельное количество строк, которое может отобразить QlistVIew - 134217724 Это огранечиние класса QVector. При этом объем, занимаемый приложением в памяти 520Mb. Получил на форуме прикольный номер пользователя - килобайт ![]() |
|
|
SABROG |
![]() ![]()
Сообщение
#61
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Кроссплатформенный метод установки приоритета для приложени. Навеяно этим постом.
Вариант 1.
Вариант 2. Установка приоритета после входа в цикл событий.
Вариант 3. Более легковесный вариант установки приоритета после входа в цикл событий, если вместо класса Object будет какой-нибудь MainWindow.
Для 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, или установка класса приоритета в момент запуска приложения:
Установка приоритета приложения для linux может не работать в некоторых ситуациях о чем сказано в документации к метод QThread::setPriority(). Сообщение отредактировал SABROG - 23.2.2010, 16:58 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#62
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ну собственно один вариант ещё и в списке рассылке, Где создаётся пользовательское событие.
|
|
|
SABROG |
![]()
Сообщение
#63
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#64
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Выложу сегодня 2 полезных "хака", которые могут пригодится при отладке приложения:
Первый хак - для доступа к приватным классам Qt:
Эту функцию можно использовать например для включения функционала в QLineEdit, который пишет текст типа "введите сюда что-нибудь", когда в QLineEdit ничего нет:
Или для установки своего виджета вместо QTableCornerButton в QTableView:
Второй хак - для перевода перечеслений области имен Qt в текстовые строки:
Использовать так:
Методы опробованы на Qt версии 4.6.2, в других версиях они могут не работать. Сообщение отредактировал SABROG - 3.4.2010, 8:28 |
|
|
loz |
![]()
Сообщение
#65
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 10.4.2010 Пользователь №: 1615 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Думаю что в данной теме необходимо упомянуть об интересной возможности Qt - функции прямого копировани участков памяти :
Данная функция копирует n байт из src в dest. Разумеется, вся ответственность за проверку размеров лежит на программисте. Для примера использования могу показать приведение типов, обычными способами которое производится довольно трудоемко, а именно - мне надо было работать со строками в их битовом представлении. В Qt есть два класса - QString и QBitArray, возможности нормальной конвертации данных между ними я найти не смог, а требование к производительности кода было достаточно высоко, пришлось сделать так:
И здесь еще есть инетересная особенность класса QBitArray, как вы заметили для обращения к данным в нем мы прибавляли к указателю 1, т.е. данны идут со второго байта, но почему? А потому, что биты из QBitArray хранятся как реальные биты, но т.к. в памяти минимальная еденица хранения - байт, то что же делать с массивом например из 9 бит? Так вот в этом первом байте как раз хранится количество используемых бит последнего байта массива. Все просто =) |
|
|
Andrewshkovskii |
![]()
Сообщение
#66
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 351 Регистрация: 27.12.2008 Пользователь №: 467 Спасибо сказали: 18 раз(а) Репутация: ![]() ![]() ![]() |
Выложу сегодня 2 полезных "хака", которые могут пригодится при отладке приложения: Первый хак - для доступа к приватным классам Qt:
Эту функцию можно использовать например для включения функционала в QLineEdit, который пишет текст типа "введите сюда что-нибудь", когда в QLineEdit ничего нет:
Вот у меня 2 вопроса : что делает функция этого тимплейта?возвращает указатель на метод приватного класса по имени метода?(с тимплейтами знаком поверхностно, и с указателями на функции практически так же) и 2ой : Я так понимаю, метод и пропертя placeholderText для QLineEdit будет только в версии 4.7 ? |
|
|
SABROG |
![]()
Сообщение
#67
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
что делает функция этого тимплейта? Возвращает указатель, который содержится в d_ptr переменной и приводит его к одному из приватному базовому классу. Например для QLineEdit можно получить сразу 3 приватных класса: QLineEditPrivate, QWidgetPrivate, QObjectPrivate. Нужный можно выбрать. Я так понимаю, метод и пропертя placeholderText для QLineEdit будет только в версии 4.7 ? Да. |
|
|
SABROG |
![]()
Сообщение
#68
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Администратор одного программерского форума удалил мой блог, который я вел 2 года. Там был код, который я выкладывал в постах. Никакие кэши гугла и archive.org не сохранили информацию. В общем, если вы не против, то буду тут периодически выкладывать интересные/полезные решения.
--- Добавление сигнала clicked() в QLabel средствами State Machine Framework:
Добавление флагов в свой класс на базе QObject'a и вывод состояния флагов в консоль: // myclass.h
// myclass.cpp
Результат:
Сообщение отредактировал SABROG - 24.4.2010, 17:23 |
|
|
Andrewshkovskii |
![]()
Сообщение
#69
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 351 Регистрация: 27.12.2008 Пользователь №: 467 Спасибо сказали: 18 раз(а) Репутация: ![]() ![]() ![]() |
Да, я тоже заметил, что удалили. Хотел инфу кое-какую почитать..и на тебе..
![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#70
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Цитата( SABROG) Администратор одного программерского форума удалил мой блог, который я вел 2 года . Имеешь в виду свой блог на vingrade. Очень жаль. Заглядывал иногда. Они как нибудь обосновали свои действия?З,Ы, Может и нам расширение для блогов поставить? |
|
|
SABROG |
![]()
Сообщение
#71
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Администратор это объяснил так:
Цитата Все блоги, которые давно не обновлялись, и те, что использовались только для SEO были удалены. Для SEO я блог не использовал. Обновлялся он конечно не часто, но это не повод удалять полезную информацию у которой нет срока давности. Сообщение отредактировал SABROG - 24.4.2010, 15:45 |
|
|
SABROG |
![]()
Сообщение
#72
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
На заметку:
Заполняем Qt контейнер без for:
Ищем элемент контейнера удовлетворяющий нашим требованиям без for используя предикат: // поиск первого неактивного (Disabled) виджета через аттрибуты
Передача указателя на метод класса для QtConcurrent::mapped() вместо обычной функции:
Сообщение отредактировал SABROG - 26.5.2010, 20:17 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#73
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а зачем в
struct testAttributePredicate оператор operator()(QWidget* widget) ? |
|
|
SABROG |
![]()
Сообщение
#74
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
а зачем в struct testAttributePredicate оператор operator()(QWidget* widget) ? Так это обычный функтор, в функции find_if я создаю объект, передавая в конструктор параметр (аттрибут), который нужно искать, а стандартная библиотека в своем шаблоне осуществляет вызов уже через перегруженный оператор: // приблизительное поведение (не исходный код шаблона find_if)
|
|
|
SABROG |
![]()
Сообщение
#75
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Реализовал установку приоритета потока в параллельном программировании.
Как многие заметили в Qt есть метод QThread::setPriority(), а вот как задать приоритет потоку запущенному например через QtConcurrent::run() не понятно. В новом стандарте C++0x будет метод std::call_once, который является потокобезопасной функций для выполнения определеннной функции один лишь раз. Аналогичная функция есть и в BOOST'e. Посмотрев на код функции я пришел к выводу, что проще переписать её на Qt, чем заставлять людей тащить с собой BOOST. С другой стороны моя реализация получилась в 2 раза быстрей BOOST'овской, но медленней std::call_once. Связано это со скудными возможностями класса QAtomicInt, там где я бы мог обойтись быстрыми атомарными операциями загрузки (load) и сохранения (store), мне пришлось импровизировать и использовать более медленные атомарные методы (fetchAndStoreAcquire, fetchAndStoreRelease). call_once.h
call_once_test.cpp
P.S.: функция также может пригодится для создания потоко-безопасных синглтонов.
Прикрепленные файлы
|
|
|
kuzulis |
![]()
Сообщение
#76
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, а с Троллями (нокией) пробовали это обсудить? Мож они включат это в свой код?
|
|
|
SABROG |
![]()
Сообщение
#77
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#78
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В старом проекте на Borland Builder C++ у меня были кнопочки со стилем csFramed. Захотелось узнать возможно ли такие сделать в Qt. Нашел флаг для свойства border в qss - groove, но как выяснислось в нем нельзя задать контрастные цвета например черный и белый. То есть задать можно один цвет на основе которого вычисляется второй. Цвета типа черный или белый не подходят, создается просто черный бордюр. Пришлось написать собственную версию:
![]() qss
Сообщение отредактировал SABROG - 23.6.2010, 18:11 |
|
|
SABROG |
![]()
Сообщение
#79
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Продолжил издеваться над кнопками и qss:
![]() qss
|
|
|
Алексей1153 |
![]()
Сообщение
#80
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Обнаружил любопытный спецэффект: если в качестве подменю (QMenu) задать элементу другое предыдущее по иерархии меню, то при выборе пункта все предыдущие подменю изчезают с экрана и показывается указанное ))
К примеру: ---------------- m1 ---------------- A1 > (m2) A2 A3 ---------------- отделено от темы "Создание вложенного действия QAction" ---------------- m2 ---------------- A4 A5 > (m1) A6 ---------------- Выбор пунктов A1>A5 покажет на экране опять таки меню m1 --------------------------------------------------- Уточнил - не всё так радужно.
1) если в в любом вложенном меню указать меню первого уровня в качестве вложенного далее, то выбор этого пункта закроет все подменю и покажет только меню первого уровня 2) если так же указать одно из промежуточных подменю, то ничего не произойдёт 3) если так же указать самого себя в качестве подменю, то просто переоткроется (визуально ничего не произойдёт, кроме того, что подсветка в текущеи открытом подменю прыгнет наверх) 4) если так же указать не учавствовавшее в цепочке подменю, оно просто откроется как вложенное Сообщение отредактировал Алексей1153 - 1.8.2010, 18:48 |
|
|
SABROG |
![]()
Сообщение
#81
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Заметил интересную особенность при сериализации списка своих данных через оператор QDataStream в QSettings. Дело в том, что в принципе QDataStream умеет сериализовать QList, но для типа, который будет содержать контейнер нужно определять свои операторы <</>>. Предположим мы это сделали. Но при попытке сохранить список в QSettings мы получим ошибку, что тип не зарегестрирован как мета-тип:
Значит, чтобы поместить наш контейнер в QVariant надо еще прописать такую инструкцию:
Но и этого не достаточно. При запуске приложения мы получим ошибку:
Надо вызвать еще функцию:
Причем главное не напортачить с текстовым именем, оно должно точно совпадать с именем типа. В итоге, чтобы поместить список с нашими данными, предположим, в .ini файл (QSettings) нужно прописать такое:
Обратите внимание, там где вызывается второй раз qRegisterMetaTypeStreamOperators обычно предполагается, что вы где-то реализовали операторы для сериализации этого типа, но у нас эти операторы реализованы только для MyStruct. Дело в том, что Qt сама реализовала эти операторы для класса QList, нам лишь нужно сообщить какого типа данные он будет содержать. |
|
|
Гость_xls_* |
![]()
Сообщение
#82
|
Гости ![]() |
Цитата namespace Hack { template <class To, class From> inline To* d_ptr(From* ptr){ return (To*)QObjectPrivate::get(ptr);}} К сожалению классы, у которых ##Private член не объявлен в *_p.h заголовочнике не позволяют сделать такой фокус. |
|
|
SABROG |
![]()
Сообщение
#83
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Гость_xls_* |
![]()
Сообщение
#84
|
Гости ![]() |
|
|
|
SABROG |
![]()
Сообщение
#85
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
xls |
![]()
Сообщение
#86
|
Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 6.9.2010 Пользователь №: 2013 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Через include можно подключить и .cpp файл, в надежде на то, что он удачно скомпилиться, что иногда бывает, умный оптимизатор выкинет код, который не используется. Это будет не неиспользуемый, а дважды используемый код - один раз из моего cpp и второй из qt библиотеки - с соответствующим сообщением линковщика. ИМХО, лучше QObject::findChildren ничего еще не придумали. |
|
|
SABROG |
![]()
Сообщение
#87
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
ИМХО, лучше QObject::findChildren ничего еще не придумали. findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена. Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах. |
|
|
Гость_Гость_xls_*_* |
![]()
Сообщение
#88
|
Гости ![]() |
ИМХО, лучше QObject::findChildren ничего еще не придумали. findChildren() не работает, если у объекта нет родителя, да и не все D-Pointer'ы - QObject'ы или имеют имена. Я считаю, что Вы наткнулись скорее на исключение из правил. Думаю это не стандартная практика объявлять классы в .cpp файлах. А вот что пишут по этому поводу тролли:
|
|
|
kwisp |
![]()
Сообщение
#89
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Гость_Yuriy_* |
![]()
Сообщение
#90
|
Гости ![]() |
[quote name='Litkevich Yuriy' date='5.2.2009, 19:45' post='14041']
обнаружил интересное поведение в QTableView если выделена ячейка в столбце N, то нажимая кнопки букв или цифр на клавиатуре будет осуществлятся навигация по этому столбцу Здравствуйте! В QListWidget тоже присутствует такое поведение, при нажатии на букву, список перемещаеться на заглавную (нажатую) букву. Вот, так может знает кто возможность отключения такого поведения , по причине , что при этом нету реакции на keyPressEvent(QKeyEvent *pe) . Реагирует только на кнопки Ф1 - Ф 12 , шифт, таб, и т.п |
|
|
SABROG |
![]()
Сообщение
#91
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Понадобилось отследить изменения в файле, который находится в шаре на удаленном компьютере. К сожалению, QFileSystemWatcher может отслеживать только файлы и директории находящиеся на жестком диске. Но есть недокументированная возможность использовать опрос (polling), который можно включить таким образом:
На самом деле то, что идет до слова "poller", Qt особо не важно, главное, чтобы позиция слова в тексте совпадала. Вы можете проголосовать, чтобы эту возможность включили в будущие дистрибутивы официально: тут |
|
|
igor_bogomolov |
![]()
Сообщение
#92
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Если вы пишите плагины для QtDesigner и хотите что бы на форме виджет не просто отрисовывался, а вел себя как настоящий виджет, присвойте ему имя вида
, где xxx - это любая строка. Для эксперимента, киньте на форму комбобокс, добавьте в него пару итемов, после чего задайте имя в формате описанном выше. Посмотрите как изменилось поведение виджета.
|
|
|
Алексей1153 |
![]()
Сообщение
#93
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Посмотрите как изменилось поведение виджета. прикольно, но только после этого виджет не даёт редактировать свои свойства (помогает только откат действия) Кстати, что я сюда зашёл то. Как раз тоже про комбобокс: В поисках удобного выпадающего списка без прочих довесков, причём закрывающегося после потери фокуса или после выбора элемента, обнаружил следующее: если создать комбобокс, но не показывать его (то есть он всегда hide() ), то, однако, список прекрасно вываливается методом showPopUp Выбранный индекс берётся из сигнала currentIndexChanged. перед выводом списка на экран, перед скрытием (hidePopup), очисткой или изменением элементов списка сигнал нужно отсоединять, чтобы не было ложных срабатываний выбора. Подключать же сигнал нужно сразу после метода showPopup Появляется список под прямоугольником основного окна комбы, то есть так, как буд-то это окно было бы видимо. Если задать высоту комбы 0 (через setGeometry) , то верх списка будет совпадать с верхом комбы Собственно, искомые мной свойства - закрывается по ESC или при потере фокуса |
|
|
SABROG |
![]()
Сообщение
#94
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В Wiki, на Developer Network нашел интересный вариант размещения окна по центру:
|
|
|
aliks-os |
![]()
Сообщение
#95
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 7.4.2010 Пользователь №: 1603 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Уважаемый Sabrog,
вы показали как записывать в ini - qsettings.setValue("ListMyStruct", qVariantFromValue(msList));. Был бы вам очень признателен, если бы вы в ваш пример добавили как считать записанные данные из ini файл, а то что то не особо получается... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#96
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Day |
![]()
Сообщение
#97
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 26.3.2012 Пользователь №: 3287 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#98
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Обсуждение вынес в отдельную тему: Работа с QSplitter в QtCreator
|
|
|
PUMA |
![]()
Сообщение
#99
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 30.4.2015 Пользователь №: 4373 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добавлю метод альтернативный методу QTimer::singleShot(), чтобы выполнить слот при возврате в главный event loop, т.е. после выхода из метода.
Этот код помещает в очередь событий информацию о том, что надо вызвать наш слот. Эквивалентно emit signalName с connection type Qt::QueuedConnection. В принципе таким методом можно и сигналы симулировать. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#100
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 9.4.2025, 22:37 |