C++ QMainWindow中未显示自定义QWidget(Qt4.8)

C++ QMainWindow中未显示自定义QWidget(Qt4.8),c++,qt,qt4,C++,Qt,Qt4,摘要:我希望使用X11绘制一个定制的QWidget。除非该小部件位于布局或QMainWindow中,否则它将正常工作 我有一个从QWidget派生的自定义小部件,我希望它成为QMainWindow中的主小部件。当我运行这样的程序时: int main(int argc, char** argv) { QApplication app(argc, argv); ModelWidget mw; mw.show(); return app.exec(); } 一切正常

摘要:我希望使用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中用作中心小部件。我错过了什么

编辑:这是自定义小部件

进一步

根据文件,

在Qt的绘制系统之外进行渲染,例如,如果需要本机 绘制原语时,需要重新实现QWidget::paintEngine()以 返回0并设置[Qt::WA_PaintOnScreen]


我已经这样做了,但窗户仍然没有上漆。我怀疑我的X11对象之一,
Window
Display*
,正在通过将此小部件添加到布局或主窗口进行更改。

如果您怀疑自定义小部件有问题,为什么不发布其代码?@user2672165:Done。起初我没有添加代码,因为如果这个小部件是应用程序中唯一的小部件,那么它就可以正常工作。只有当我用它调用setCentralWidget时,它才不会显示。Ok。也许我应该保持安静,因为我不知道这些Qt::WA_u.会有什么影响。。属性有很多。我能给出的唯一建议是,我会测试禁用它们,看看其中是否有一个会引起麻烦。
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);
}