全屏下的QOpenGLWidget问题

时间:2016-03-12 10:04:33

标签: c++ qt qml qwidget

我使用的是Qt 5.4.0。 我在QMainWindow中添加了两个小部件:QOpenGLWidget和QQuickView。但我的问题是当我点击全屏按钮时,QQuickView会消失,然后当我最大化它时,QQuickView会出现在屏幕上。我做错了什么? 我的代码:

helper.h

#include <QBrush>
#include <QFont>
#include <QPen>
#include <QWidget>

class Helper
{
public:
Helper();

public:
void paint(QPainter *painter, QPaintEvent *event, int elapsed);

private:
QBrush background;
QBrush circleBrush;
QFont textFont;
QPen circlePen;
QPen textPen;
};

helper.cpp

#include <QPainter>
#include <QPaintEvent>
#include <QWidget>

Helper::Helper()
{
QLinearGradient gradient(QPointF(50, -20), QPointF(80, 20));
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39));

background = QBrush(QColor(64, 32, 64));
circleBrush = QBrush(gradient);
circlePen = QPen(Qt::black);
circlePen.setWidth(1);
textPen = QPen(Qt::white);
textFont.setPixelSize(50);
}

void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed)
{
painter->fillRect(event->rect(), background);
painter->translate(100, 100);

painter->save();
painter->setBrush(circleBrush);
painter->setPen(circlePen);
painter->rotate(elapsed * 0.030);

qreal r = elapsed / 1000.0;
int n = 30;
for (int i = 0; i < n; ++i) {
    painter->rotate(30);
    qreal factor = (i + r) / n;
    qreal radius = 0 + 120.0 * factor;
    qreal circleRadius = 1 + factor * 20;
    painter->drawEllipse(QRectF(radius, -circleRadius,
                                circleRadius * 2, circleRadius * 2));
}
painter->restore();

painter->setPen(textPen);
painter->setFont(textFont);
painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, QStringLiteral("Qt"));
}

glwidget.h

#include <QOpenGLWidget>
class Helper;

class GLWidget : public QOpenGLWidget
{
    Q_OBJECT
public:
GLWidget(Helper *helper, QWidget *parent);

public slots:
void animate();

protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

private:
Helper *helper;
int elapsed;
};

glwidget.cpp

#include "glwidget.h"
#include "helper.h"
#include <QPainter>
#include <QTimer>

GLWidget::GLWidget(Helper *helper, QWidget *parent)
: QOpenGLWidget(parent), helper(helper)
{
elapsed = 0;
setFixedSize(200, 200);
setAutoFillBackground(false);
}

void GLWidget::animate()
{
elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;
update();
}

void GLWidget::paintEvent(QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
helper->paint(&painter, event, elapsed);
painter.end();
}

mainwindow.h

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_pushButton_clicked();

private:
Ui::MainWindow *ui;
bool _showFullScreen;
Helper helper;
};

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QQuickView>
#include <QQuickItem>
#include <QTimer>
#include "glwidget.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
_showFullScreen = false;

QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
container->setMinimumSize(200, 200);
container->setMaximumSize(200, 200);
container->setFocusPolicy(Qt::TabFocus);
view->setSource(QUrl("QquickView.qml"));
ui->verticalLayout->addWidget(container);

GLWidget *openGL = new GLWidget(&helper, this);
ui->verticalLayout_2->addWidget(openGL);

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), openGL, SLOT(animate()));
timer->start(50);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_clicked()
{
if (_showFullScreen == false) {
    showFullScreen();
    _showFullScreen = true;
} else {
    showMaximized();
    _showFullScreen = false;
}
}

的main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

0 个答案:

没有答案