Подтвердить что ты не робот

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

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

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

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


РЕДАКТИРОВАТЬ: Я использую QDrag::setPixmap для установки графического представления перетаскиваемого объекта - важно сохранить это в пользу стандартного курсора перетаскивания, поскольку этот интерфейс используется на сенсорного устройства и, следовательно, не будет иметь видимого курсора.

4b9b3361

Ответ 1

Теперь я считаю, что, не редактируя, а затем компилируя собственную сборку 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);
}

Ответ 2

Окно X11 создается только для операции перетаскивания, если значение QDrag:: mimeData() → hasImage() истинно. Если вы измените свой код, чтобы он не использовал изображение, вместо этого вы просто получите вместо него перетаскиваемый указатель, который не вызовет перерисовку окон под ним.

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