有一个Qt应用程序。通过调用XCreateWindow函数在此应用程序中创建GL窗口,我无法编辑它。 我需要在我的Qt应用程序中的QWidget中放置Xwindow。
在文档中:
void QWidget::create ( WId window = 0, bool initializeWindow = true,
bool destroyOldWindow = true ) [protected]
如果窗口为0,则创建一个新的窗口小部件窗口,否则将窗口小部件的窗口设置为window。如果initializeWindow为true,则初始化窗口设置几何体等。如果initializeWindow为false,则不执行初始化。仅当窗口是有效窗口时,此参数才有意义。
...
为了验证函数QWidget :: create的结果,有以下代码:
class ParentWindow : public QWidget
{
Q_OBJECT
public:
ParentWindow(WId id)
{
create(id);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton* button = new QPushButton("MEGA BUTTON");
button->show();
ParentWindow w(button->winId());
w.show();
return a.exec();
}
当应用程序启动时,会出现一个空白窗口。虽然预期窗口包含一个按钮(或者是一个按钮)。 如何将X11窗口放入我的QWidget?
答案 0 :(得分:0)
问题已解决:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Display* display = XOpenDisplay(NULL);
XSynchronize(display, True);
XSetErrorHandler(myErrorHandler);
Window x11root = XDefaultRootWindow(display);
int x = 500;
int y = 500;
unsigned int width = 150;
unsigned int height = 150;
unsigned int borderWidth = 0;
long colorBlue = 0xff0000ff;
Window x11w = XCreateSimpleWindow(display, x11root, x, y,
width, height, borderWidth, 1 /*magic number*/, colorBlue);
QWidget w;
w.resize(300, 300);
w.show();
XReparentWindow(display, x11w, w.winId(), 0, 0);
XMapWindow(display, x11w); // must be performed after XReparentWindow,
// otherwise the window is not visible.
return a.exec();
}
要通过窗口小部件解决问题,ParentWindow失败了 - xwindow嵌入在QWidget中,但是在调整窗口大小并关闭它时会出现问题(它没有关闭)。
答案 1 :(得分:0)
QX11EmbedContainer可能就是您所需要的。
答案 2 :(得分:0)
让Qt创建你的窗口然后使用Qt X11 Drawable和你的X11 / GL代码。
使用OpenGL和Qt,如果Qt使用OpenGL进行渲染,则必须使用Qt OpenGL上下文。请注意,Qt希望将OpenGL状态恢复到上次使用状态时的状态。
您可以使用QX11Info访问Drawable(同时检查Compiler does not see QX11Info,因为这包含了将X11与Qt包含在一起时的常见问题)。
Qt提供对X11和OpenGL的访问方式似乎在主要版本和次要版本之间发生变化,因此您可能需要进行一些挖掘。
我知道上面的Qt5.1可以达到5.5。 Qt5.6这个方法有问题,我还没有解决。
答案 3 :(得分:-1)