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

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

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

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


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

Ответы [ 2 ]

1 голос
/ 16 марта 2012

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

Точно так же я не могу найти какой-либо способ избавиться от следа призрака, изменив настройки моего оконного менеджера или используя оконный менеджер композитинга (в любом случае, спасибо @atomice).Использование OpenGL в качестве средства визуализации немного увеличивает скорость перерисовки экрана, но не является идеальным и создает свои собственные проблемы (см. Запуск операции перетаскивания 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);
}
0 голосов
/ 29 ноября 2011

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

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

...