Здравствуйте, гость ( Вход | Регистрация )
Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
---|---|---|---|---|---|
25.1.2011, 22:15 | Секреты и интересные возможности Qt | В Wiki, на Developer Network нашел интересный вариант размещения окна по центру:
|
arial, Jabberwocky, | ||
18.1.2011, 20:11 | Секреты и интересные возможности Qt | Понадобилось отследить изменения в файле, который находится в шаре на удаленном компьютере. К сожалению, QFileSystemWatcher может отслеживать только файлы и директории находящиеся на жестком диске. Но есть недокументированная возможность использовать опрос (polling), который можно включить таким образом:
На самом деле то, что идет до слова "poller", Qt особо не важно, главное, чтобы позиция слова в тексте совпадала. Вы можете проголосовать, чтобы эту возможность включили в будущие дистрибутивы официально: тут |
97WzugSKd31, 9or6UxhWRa1, DaLgAMYeVr1, gHzcXItj3a1, hxr3Wawd9g1, | ||
14.12.2010, 11:39 | .ico | KLIF, | |||
10.12.2010, 21:04 | Как в QDataStream указать разделитель при считывании файла? | Можно использовать метод QString QTextStream::readLine ( qint64 maxlen = 0 ) + QString::split() |
Rocky, | ||
20.8.2010, 18:25 | Секреты и интересные возможности Qt | Заметил интересную особенность при сериализации списка своих данных через оператор QDataStream в QSettings. Дело в том, что в принципе QDataStream умеет сериализовать QList, но для типа, который будет содержать контейнер нужно определять свои операторы <</>>. Предположим мы это сделали. Но при попытке сохранить список в QSettings мы получим ошибку, что тип не зарегестрирован как мета-тип:
Значит, чтобы поместить наш контейнер в QVariant надо еще прописать такую инструкцию:
Но и этого не достаточно. При запуске приложения мы получим ошибку:
Надо вызвать еще функцию:
Причем главное не напортачить с текстовым именем, оно должно точно совпадать с именем типа. В итоге, чтобы поместить список с нашими данными, предположим, в .ini файл (QSettings) нужно прописать такое:
Обратите внимание, там где вызывается второй раз qRegisterMetaTypeStreamOperators обычно предполагается, что вы где-то реализовали операторы для сериализации этого типа, но у нас эти операторы реализованы только для MyStruct. Дело в том, что Qt сама реализовала эти операторы для класса QList, нам лишь нужно сообщить какого типа данные он будет содержать. |
9or6UxhWRa1, | ||
3.8.2010, 11:51 | Программа падает при выходе из QMessageBox | Похоже Qt Tool окна не считает за полноценные окна. Так будет работать, если указать родителя:
И так будет работать, если родителя не указывать:
По умолчанию setQuitOnLastWindowClosed = true. Видимо когда QMessageBox закрывается, то Qt думает, что это последнее окно. Но после решений, что я написал выше возникает другая проблема - приложение остается висеть в процессах, слот close() для Tool окна почему-то не срабатывает. Аттрибут Qt::WA_DeleteOnClose тоже не помогает. --- В общем, если дальше работать с Tool окном, то нужно взять за правило, что все Top Level окна должны иметь родителя. Затем прописать такое, чтобы корректно обрабатывать закрытие главного Tool окна:
|
Gambit, | ||
2.8.2010, 17:46 | рандом | Юр, мне кажется это не так. Цитата The sequence of random numbers generated is deterministic per thread. For example, if two threads call qsrand(1) and subsequently calls qrand(), the threads will get the same random number sequence. Последовтельность сгенеренных номеров предопределены для каждого потока. Для примера 2 потока вызывают qsrand(1) и подпоследовательность вызывает qrand(), потоки получат ту же последовательность номеров. Поэтому я предложил такой вариант:
В итоге распределения "семечек" по потокам может быть таким: Thread 1 - 1 Thread 2 - 50 Thread 3 - 23 Thread 4 - 78 ... А уж от этих "семечек" мы получаем разную последовательность случайных чисел при вызове qrand() в каждом из потоков. В принципе можно еще как-нибудь так извернуться: qsrand((int)this) |
eldar85, | ||
2.8.2010, 14:15 | рандом | Оно и понятно, потоки наверняка почти одновременно запускаются, не успевает даже время пройти. Ты вызови один раз qsrand(), потом вызови qrand() для каждого потока, затем в каждом потоке вызови снова qsrand(), но уже со значениями полученными от предыдущего qrand'a(). |
eldar85, | ||
28.7.2010, 10:47 | В очередной раз о компоновщиках | Не знаю зачем это надо, но сделать можно так:
Конечно в дизайнере проще выставить через редактор свойств. |
AntonH851, | ||
6.7.2010, 19:55 | Подскажите чем лучше создавать программ? | bynet, | |||
6.7.2010, 17:23 | В продолжение о TableView + checkState | Если слоты с сигналами не подходят, тогда остается наследование от QStandardItem например. Перекрываешь метод setCheckState(Qt::CheckState state) и пишешь логику. Если у итема есть родитель, то проверяем его галки и выставляем, если итем сам родитель то пробегаемся по всем детям и ставим галку в зависимости от результата. Стандартного подобного поведения в Qt нет. |
ЙаМайскЫйПчОЛ, | ||
21.6.2010, 18:23 | Секреты и интересные возможности Qt | Реализовал установку приоритета потока в параллельном программировании. Как многие заметили в 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.: функция также может пригодится для создания потоко-безопасных синглтонов. |
kwisp, Litkevich Yuriy, | ||
26.5.2010, 17:27 | Секреты и интересные возможности Qt | На заметку: Заполняем Qt контейнер без for:
Ищем элемент контейнера удовлетворяющий нашим требованиям без for используя предикат: // поиск первого неактивного (Disabled) виджета через аттрибуты
Передача указателя на метод класса для QtConcurrent::mapped() вместо обычной функции:
|
Litkevich Yuriy, | ||
30.4.2010, 8:28 | Как получить индекс вкладки в QTabWidget? | Конечно так делать не правильно и нужно наследоваться, но если вопрос поставлен таким образом, что отвергает единственно верный вариант, то приведу пару неверных, но пока рабочих на Qt 4.6.2:
|
molchanoviv, | ||
24.4.2010, 11:55 | Секреты и интересные возможности Qt | Администратор одного программерского форума удалил мой блог, который я вел 2 года. Там был код, который я выкладывал в постах. Никакие кэши гугла и archive.org не сохранили информацию. В общем, если вы не против, то буду тут периодически выкладывать интересные/полезные решения. --- Добавление сигнала clicked() в QLabel средствами State Machine Framework:
Добавление флагов в свой класс на базе QObject'a и вывод состояния флагов в консоль: // myclass.h
// myclass.cpp
Результат:
|
Litkevich Yuriy, | ||
22.4.2010, 1:14 | Нажмите любую клавишу чтобы продолжить | Можно попробовать унаследоваться от QApplication и переопределить метод notify, где ловить все нажатия.. |
precious, | ||
19.4.2010, 12:13 | Секреты и интересные возможности Qt | что делает функция этого тимплейта? Возвращает указатель, который содержится в d_ptr переменной и приводит его к одному из приватному базовому классу. Например для QLineEdit можно получить сразу 3 приватных класса: QLineEditPrivate, QWidgetPrivate, QObjectPrivate. Нужный можно выбрать. Я так понимаю, метод и пропертя placeholderText для QLineEdit будет только в версии 4.7 ? Да. |
Andrewshkovskii, | ||
12.4.2010, 17:59 | Как сохранить экземпляр объекта QWidget в ui файле? | QtDesigner модуль. void QAbstractFormBuilder::save ( QIODevice * device, QWidget * widget ) [virtual] |
maint, mva, | ||
2.4.2010, 0:05 | Секреты и интересные возможности Qt | Выложу сегодня 2 полезных "хака", которые могут пригодится при отладке приложения: Первый хак - для доступа к приватным классам Qt:
Эту функцию можно использовать например для включения функционала в QLineEdit, который пишет текст типа "введите сюда что-нибудь", когда в QLineEdit ничего нет:
Или для установки своего виджета вместо QTableCornerButton в QTableView:
Второй хак - для перевода перечеслений области имен Qt в текстовые строки:
Использовать так:
Методы опробованы на Qt версии 4.6.2, в других версиях они могут не работать. |
DaiV, Litkevich Yuriy, | ||
13.3.2010, 1:15 | Проблема со сборкой проекта в Windows | Обычно такое возникает, когда проект пытаются собрать на разных версиях mingw/gcc. Сначала всё собрали на одной версии, потом перенесли и пытаются собрать на другой. Возможно проблема в путях, 2 mingw разных версий на одной машине. Как бы там ни было пересборка с distclean должна решить проблему. |
asdf, | ||
10.3.2010, 16:04 | Выделить текст в QComboBox | QLineEdit * QComboBox::lineEdit () const void QLineEdit::selectAll () [slot] |
AntonH851, | ||
8.3.2010, 23:06 | Как запустить QThread чтобы он не вешал GUI? | это уже не запуск, а простой вызов метода. только тогда не понятно зачем QThread использовать. Так и есть. Интересно почему тролли не поместили метод run() в protected секцию, тогда бы можно было бы его спокойно наследовать и при этом невозможно было бы его вызвать за пределами класса QThread и наследников, а только через start(). Брр, ничего не понимаю, он в protected секции. Почему-то его возможно вызвать ? Ой, кое-кто его вытащил "наружу":
Вопрос к знатокам C++, возможно ли создать класс с protected членами, которым бы невозможно было бы поменять спецификатор доступа при наследовании? Теоретически можно сделать run() чистой виртуальной функцией с private спецификатором доступа. Вот только наследование от QObject'a может не дать это сделать. |
flareguner, | ||
8.3.2010, 20:39 | c++ double | Так например:
10.0 - десятые, 1 знак 100.0 - сотые, 2 знака 1000.0 - тысячные, 3 знака ... 1000000.0 - миллионные, 6 знаков после запятой Только надо проверку какую-нибудь, чтобы int не переполнился. |
mycoding, | ||
8.3.2010, 20:17 | Текст в system tray | Писал пару лет назад:
Думаю идея ясна. |
coo_zoo, | ||
1.3.2010, 23:34 | Всплывающие окна | Проблема может только появится, если диалогов может быть несколько и они скрыты например. Зато если задать уникальное имя объекту, то промахов быть не должно:
Но я не пойму как мы вообще до такого докатились? Диалоги сам по себе редко когда создаются, а это значит, что в большинстве случаев у нас есть указатель на него, который можно поместить в private секцию класса. А проверка делается легко QWidget::isVisible(). |
breeve, | ||
Текстовая версия | Сейчас: 7.9.2024, 22:57 |