Как нарисовать X11 Pixmap с помощью Qt5

Я пытаюсь нарисовать X11 Pixmap на QWidget.

Раньше, используя Qt4.x, я использовал QPixmap::fromX11Pixmap для создания QPixmap, который я мог бы легко использовать при рисовании. Однако эта функция была удалена в Qt5, и, насколько мне известно, эта функция не была доступна где-либо еще в Qt Framework.

Хотя мне удалось создать и выделить X11 Pixmap, я не смог найти никакого решения для рисования. Любые предложения / решения приветствуются!


person Matthew    schedule 28.05.2013    source источник
comment
Если вы хотите сделать снимок экрана, вы можете использовать QScreen::grabWindow; Я полагаю, что вы можете использовать в этой функции любое Drawable, но я никогда не пробовал.   -  person n. 1.8e9-where's-my-share m.    schedule 29.05.2013
comment
@ n.m. QScreen::grabWindow в своей реализации использует функцию X11 XGetWindowAttributes. Есть ли опыт использования этой функции с XPixmap? В документации для XGetWindowAttributes говорится, что он может сообщать BadWindow, когда значение аргумента Window не указывает имя определенного окна. Поэтому не совсем уверен, что использование XPixmap будет работать как Drawable, а не Window. Я попробую и опубликую результат.   -  person Matthew    schedule 06.06.2013
comment
Хорошо, тогда, вероятно, невозможно использовать какие-либо чертежи. Я не понимаю, почему можно использовать растровые изображения X11 в качестве источников изображений; заботиться, чтобы поделиться?   -  person n. 1.8e9-where's-my-share m.    schedule 06.06.2013
comment
@ n.m. Мы используем сторонний продукт, который преобразует изображение в растровое изображение X11, чтобы мы могли выполнять дополнительную отрисовку, наложения с тенями, кнопками и т. Д. Мы находимся в процессе перехода от этого решения, но пока мы ' я застрял с растровыми изображениями X11.   -  person Matthew    schedule 06.06.2013


Ответы (1)


У меня была такая же проблема, и я не нашел ответа. После нескольких хаков я пришел к этому решению.

// Initialize your X11 enviroment.
Display* display ...
Pixmap pixmap ... 
/* Do your pixmap drawing HERE */
// Make sure all drawing have been done
XFlush(display);
// Convert your Pixmap to XImage
XImage *image = XGetImage(display, pixmap, 0, 0, width, height, 0xFFFFFFFF, ZPixmap);
// Convert XImage to QImage
QImage tempImage = qimageFromXImage(image);
// Destroy temporal XImage
XDestroyImage(image);
// Finally create a QPixmap
QPixmap finalPixmap = QPixmap::fromImage(tempImage);

Код функции qimageFromXImage(...) можно найти по адресу https://github.com/adobe/webkit/blob/master/Source/WebCore/plugins/qt/QtX11ImageConversion.h Вы можете скопировать заголовок и реализацию в свое исходное дерево.

Проблема решена! Может использоваться с QQuickPaintedItem или QGraphicsItem.

person Steve Mc Gragor    schedule 09.08.2017