Я использую QClipboard в приложении, где большие 3D-объекты могут быть скопированы и вставлены. Операции вставки могут блокировать графический интерфейс в течение некоторого времени, так как многие данные должны быть де-сериализованы.Откажитесь от QClipboard :: dataChanged(), если он вызван тем же приложением
Я хотел бы оптимизировать это для частых случаев, когда объекты копируются и вставляются в одно и то же окно приложения. В этом случае мне не нужен системный буфер обмена, простые внутренние функции могут хранить и копировать объект C++ без необходимости десериализации.
Так идея:
1) Когда «Copy» называется, копия объекта хранится внутри, и объект сериализации и помещен в буфер обмена. Флаг установлен, чтобы помнить, что следующее действие вставки должно непосредственно принимать сохраненный объект, а не системный буфер обмена.
2) Когда системный буфер обмена был изменен другим приложением (возможно, с той же программой, но с другим процессом), флаг установлен, чтобы знать, что следующее действие вставки должно быть выполнено из системного буфера обмена с десериализацией.
3) Действие «Вставить» проверяет флаг и либо берет внутренне сохраненный объект, либо десериализует объект из системного буфера обмена.
Вопрос 1). Всякий раз, когда я меняю системный буфер обмена, срабатывает сигнал dataChanged(). И это выполняется асинхронно, долгое время после вызова QClipboard :: setData. Поэтому установка blockSignals() во время вызова setData() не помогает.
Любая идея?
Спасибо!
Полностью неблокирующая паста не является желательным поведением в большинстве случаев. Если операция вставки занимает много времени, обычно вы хотите, чтобы пользователь не взаимодействовал с графическим интерфейсом в течение этого времени. QProgressDialog с кнопкой отмены является imho намного лучше. – galinette
@galinette Вы можете предлагать пользователю какое-либо поведение, если вы не блокируете цикл событий. «QProgressDialog» бесполезен, если вы не позволяете циклу событий работать, чтобы поддерживать пользовательский интерфейс. На самом деле, люди так часто ошибаются, что им пришлось добавить хак к методу setValue' диалога: он будет обрабатывать любые затяжные события для вас, даже если это означает потенциальное повторное внесение некоторого кода, который не был предназначен для быть повторно введенным. Очень легко определить, поддерживает ли приложение цикл своего события или нет. Те, которые обычно не требуют дополнительных затрат на ОС, делают диагностические снимки (OS X!). –
@galinette Вы можете определенно показать модальный диалог прогресса, в то время как десериализация происходит в фоновом режиме. –