Встраивание QWidget в окно X11
Я хочу встроить два QWidget в окно, созданное с помощью XLib. Я написал этот код:
// Assume all the necessary headers included
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// Create widget 1
QWidget widget1 ;
widget1.setGeometry(44,44,666,666);
widget1.show();
// Create widget 2
QWidget widget2 ;
widget2.setGeometry(144,144,666,666);
widget2.show();
Display *display = XOpenDisplay( 0 ); // 0 parameter for default values
if ( display != NULL )
{
// Create the x11 window using XLib
Window w = XCreateWindow(display, DefaultRootWindow(display),
0, 0, 1200, 1100, 0,CopyFromParent, CopyFromParent, CopyFromParent, 0, 0);
XMapWindow(display, w);
XFlush(display);
XReparentWindow(display, widget1.winId(), w, 0, 0);
XReparentWindow(display, widget2.winId(), w, 1, 10);
}
else
std::cout << "Error: Opening display" << std::endl ;
return app.exec();
}
Я могу запустить эту программу успешно, но эти виджеты не внедряются в созданное мной окно X11. Все три вещи создаются, но независимо. Эти виджеты не внедряются в окно.
2 ответа
Следующее будет означать, что, возможно, вам нужно подумать о порядке отображения виджетов, чтобы winId для ваших виджетов был установлен на что-то, что может быть передано в XReparentWindow.
http://www.qtforum.org/article/16529/xreparent-external-x11-application.html
В качестве альтернативного решения вы можете использовать QX11EmbedWidget вместо QWidget в приложении qt и протокол XEmbed в приложении XLib, например, для этого QX11EmbedContainer. Это решение имеет плюс: вы можете реализовать разные окна в разных процессах.