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

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

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

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


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


person sam-w    schedule 28.09.2011    source источник
comment
Хороший вопрос, и извините, я не могу помочь. Одна вещь, которая поразительна, заключается в том, что ваш фактический вопрос появляется в последней строке вашего сообщения. Попробуйте сформулировать заголовок как вопрос, а позже объясните обстоятельства. Может помочь с тем, чтобы нужные люди взглянули на вашу проблему. Ваше здоровье!   -  person Robin    schedule 07.11.2011
comment
Привет @Robin, последовал твоему совету :)   -  person sam-w    schedule 08.11.2011


Ответы (2)


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

Точно так же я не могу найти способ избавиться от призрачного следа, изменив настройки моего оконного менеджера или используя составной оконный менеджер (все равно спасибо @atomice). Использование OpenGL в качестве средства рендеринга немного увеличивает скорость перерисовки экрана, но это не идеально и приводит к собственным проблемам (см. on-x11-w-opengl-causes-screen-flicker">Запуск операции перетаскивания Qt на X11 с 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);
}
person sam-w    schedule 16.03.2012

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

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

person atomice    schedule 29.11.2011
comment
Этот интерфейс будет использоваться на сенсорном экране без курсора, поэтому боюсь, что изображение будет необходимо. Объект не имеет значения, если честно - я настраиваю перетаскивание стандартным способом (т.е. new отключаю его, устанавливаю mimeData, pixmap и hotSpot, затем вызываю QDrag::exec()). Я не думал о том, чтобы попробовать setCursor, а не setPixmap, хотя я попробую завтра. Ваше здоровье :) - person sam-w; 29.11.2011
comment
Если это для киоска или устройства (а не для приложения общего назначения), вы можете попробовать использовать композитный оконный менеджер, если аппаратное обеспечение поддерживает его. - person atomice; 01.12.2011