Медленная перекраска под перетаскиваемым объектом на X... может ли Qt принудительно перетаскивать операции только для внутренних?

Я ввожу Qtперетаскивание API через окна и X. Когда я забираю объект в приложении, работающем на X и перетащите его, он оставляет белый призрачный след на окне под ним, как будто окно под ним медленно перекрашивается там, где перетаскиваемый объект ранее скрывал часть себя.

Я считаю, что это симптоматично для той же проблемы, с которой Qt только что решил изменение размера окон вызывает мерцание в дочерних виджетах на X windows - т. е. перетаскиваемый объект рассматривается как отдельное собственное окно, и поэтому X обрабатывает отсечение от перетаскиваемого объекта к окну внизу. С X это так Qt, мы получаем эффект призраков.

кто-нибудь испытывал те же проблемы? Одно из решений, которое приходит на ум, - использовать ту же технику, что и в блоге статья связана выше и остановить перетаскиваемый объект рассматривается как собственное окно, предположительно за счет перетаскивания ограничивается только моим приложением (у меня нет проблем с этим). Кто-нибудь знает, как заставить операции перетаскивания быть только внутренними?


EDIT: Я использую QDrag::setPixmap чтобы установить графическое представление перетаскиваемого объекта-важно, чтобы я сохранил это в пользу стандартного курсора перетаскивания, поскольку этот интерфейс используется на сенсорном устройстве, и, следовательно, не виден курсор.

2 ответов


теперь я считаю, что за исключением редактирования, а затем компиляции моей собственной сборки Qt (не вариант для меня), я не могу заставить операции перетаскивания быть только внутренними.

равным образом, я не могу найти способ избавиться от следа призрака, настроив настройки оконного менеджера или используя композитный оконный менеджер (спасибо в любом случае, хотя @atomice). Использование OpenGL в качестве визуализатора немного увеличивает скорость перекраски экрана, но не идеально и создает собственные проблемы (см. запуск операции перетаскивания Qt на X11 w / OpenGL вызывает мерцание экрана). Мне все равно было бы очень интересно услышать какие-либо идеи.

У меня, однако, есть обходной путь для моей проблемы, которая работает как на Windows, так и на X. Вот упрощенная версия:

void DoDrag()
{
  //Prepare the graphical representation of the drag
  mDragRepresenter = new QWidget(QApplication::activeWindow());
  mDragRepresenter->setAttribute(Qt::WA_TransparentForMouseEvents);
  mDragRepresenter->SetPixmap(GenerateDragPixmap());

  RepositionDragRepresenter();
  mDragRepresenter->show();

  QTimer UpdateTimer;
  connect(&UpdateTimer, SIGNAL(timeout()), this, SLOT(RepositionDragRepresenter()));
  UpdateTimer.start(40);

  //Start the drag (modal operation)
  Qt::DropAction ResultingAction = Drag->exec(Qt::CopyAction);

  UpdateTimer.stop();
  delete mDragRepresenter;
}

void RepositionDragRepresenter()
{
  mDragRepresenter->move(QApplication::activeWindow()->mapFromGlobal(QCursor::pos()) - mDragRepresenterHotSpot);
}

окно X11 создается только для операции перетаскивания, если qdrag:: mimeData()->hasImage() имеет значение true. Если вы измените свой код, чтобы он не использовал изображение, вы просто получите курсор перетаскивания, который не вызовет перекраску окон под ним.

вы не указываете, какой объект вы перетаскиваете или как вы настраиваете операцию перетаскивания. Можешь добавить код, чтобы показать это?