QGLWidget无法转换为QPixmap

时间:2017-12-07 18:26:00

标签: qt drag-and-drop qpixmap qlabel qglwidget

我基本上试图实现拖放。我有一个来自QGLWidget的派生小部件。这个widegt绘制了一个三角形。我尝试从它渲染一个像素图,并在Qlabel上使用这个像素图显示在拖动部分。但是我无法执行此操作,因为拖动部分中没有显示任何内容。但是,如果我使用QPainter绘制另一个QPixmap(类似圆角矩形)并在QLabel上使用像素图,它会显示在拖动部分中。这意味着只显示一个圆角矩形,而不是三角形和圆角矩形。程序中没有错误,我可以向您保证正确创建了QGlWidget(派生)。

以下是派生小部件的示例代码,但这准确描述了我的问题:     glwidget.h

#ifndef _GLWIDGET_H 
#define _GLWIDGET_H

#include <QtOpenGL/QGLWidget>

class GLWidget : public QGLWidget {

Q_OBJECT // must include this if you use Qt signals/slots

public:
GLWidget(QWidget *parent = NULL);

protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
};

#endif  /* _GLWIDGET_H */

接下来是glwidget.cpp:

#include <QtGui/QMouseEvent>
#include "glwidget.h"
#include <GL/glu.h>

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {
setMouseTracking(true);
}

void GLWidget::initializeGL() {
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glEnable(GL_POLYGON_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0, 0, 0, 0);
}

void GLWidget::resizeGL(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, 0, h); // set origin to bottom left corner
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void GLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glBegin(GL_POLYGON);
glVertex2f(0,0);
glVertex2f(100,500);
glVertex2f(500,100);
glEnd();
}

void GLWidget::mousePressEvent(QMouseEvent *event) {

}
void GLWidget::mouseMoveEvent(QMouseEvent *event) {
printf("%d, %d\n", event->x(), event->y());
}

void GLWidget::keyPressEvent(QKeyEvent* event) {
switch(event->key()) {
case Qt::Key_Escape:
    close();
    break;
default:
    event->ignore();
    break;
}
}

接下来,我在dragwidget.cpp中创建一个QGlWidget(派生对象)和一个QLabel对象。为此,我所采用的代码来自Qt拖放示例。该示例的链接是: http://doc.qt.io/qt-5/qtwidgets-draganddrop-draggableicons-example.html 在这个例子中,我只是通过添加QGlWidget来更改dragwidget的构造函数:DragWidget :: DragWidget(QWidget * parent):QFrame(parent)。

DragWidget::DragWidget(QWidget *parent)
: QFrame(parent)
{
setMinimumSize(50, 100);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAcceptDrops(false);

GLWidget *glWidget = new GLWidget;

QPixmap pixies = glWidget->renderPixmap(glWidget->width(),glWidget->height());
QLabel sample;
sample.setPixmap(pixies);
qInfo("here");
QPoint pStick3;
pStick3.setX(17);
pStick3.setY(10);
sample.move(pStick3);
sample.show();




QPixmap *StickVert = new QPixmap(120,120);
StickVert->fill(Qt::transparent);
QPainter painter2(StickVert);
painter2.setPen(QPen(QBrush(QColor(Qt::blue)),2,Qt::DashLine));
painter2.setBrush(QBrush(QColor(Qt::yellow)));

painter2.translate(50, 50);
painter2.rotate(90.0);
// painter2.scale(0.6, 0.9);
painter2.translate(-50, -50);

QPoint pStick1;
pStick1.setX(10);
pStick1.setY(10);

QRect rect1(20, 10, 90, 20);

painter2.drawRoundedRect(rect1, 10, 10);
QLabel *labelStickvert = new QLabel("", this);

labelStickLeft->setPixmap(*StickLeft);
labelStickLeft->move(pStick3);

我输出为:

actual output

请帮助!!

0 个答案:

没有答案