摘要:我希望使用X11绘制自定义QWidget。除非该窗口小部件位于布局或QMainWindow
中,否则它可以工作我有一个从QWidget派生的自定义小部件,我想成为QMainWindow中的主要小部件。当我运行这样的事情时:
int main(int argc, char** argv) {
QApplication app(argc, argv);
ModelWidget mw;
mw.show();
return app.exec();
}
一切正常,包括调整大小,模糊和显示窗口内容等等。
但是,如果我尝试将该小部件用作QMainWindow中的中央小部件,则QMainWindow的中央小部件区域中不会绘制任何内容。
这是QMainWindow的构造函数:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
modelwidg = new ModelWidget;
setCentralWidget(modelwidg);
createActions();
createMenus();
}
我感觉有一些与我需要实现的自定义窗口小部件的大小或调整大小策略相关的内容,但我找不到任何关于窗口小部件必须提供哪些功能的文档,以便它可以用作QMainWindow中的中央窗口小部件。我错过了什么?
编辑:这是自定义小部件
ModelWidget::ModelWidget(QWidget *parent) :
QWidget(parent)
{
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_NativeWindow);
setAutoFillBackground(true);
const QX11Info &info = x11Info();
// Elided X11 and glX specific stuff
create(wnd, true, true);
}
void ModelWidget::paintEvent(QPaintEvent *)
{
// scene.render is just some OpenGL stuff
scene->render();
glXSwapBuffers(dpy, glxwnd);
}
void ModelWidget::resizeEvent(QResizeEvent * e)
{
glViewport(0, 0, e->size().width(), e->size().height());
scene->set_aspect(float(e->size().width()) / float(e->size().height()));
update();
}
QSize ModelWidget::sizeHint() const
{
return QSize(640, 480);
}
此外... 的
根据文件,
在Qt的绘画系统之外渲染,例如,如果你需要原生的 绘制原语,需要重新实现QWidget :: paintEngine() 返回0并设置[Qt :: WA_PaintOnScreen]。
我已经这样做了,但窗户仍未上漆。我怀疑我的一个X11对象Window
,Display*
正在通过将此小部件添加到布局或MainWindow来进行更改。