#include <QtGui>
#include <QtOpenGL>
#include <cmath>
#ifndef GL_MULTISAMPLE
#define GL_MULTISAMPLE 0x809D
#endif
#include "vowelcube.h"
VowelCube::VowelCube(QWidget *parent)
: QGLWidget(parent)
{
// 必须注释掉
//setFormat(QGLFormat(QGL::SampleBuffers));
rotationX = -38.0;
rotationY = -58.0;
rotationZ = 0.0;
scaling = 1.0;
// 后面添加的
setAutoBufferSwap( false );
setAutoFillBackground( false );
createGradient();
createGLObject();
}
VowelCube::~VowelCube()
{
makeCurrent();
glDeleteLists(glObject, 1);
}
void VowelCube::paintEvent(QPaintEvent * /* event */)
{
/* 这是原有的代码
QPainter painter(this);
drawBackground(&painter);
drawCube();
drawLegend(&painter);
*/
// 这是后面添加的代码
QPainter painter(this);
drawBackground(&painter);
painter.end();
drawCube();
painter.begin(this);
drawLegend(&painter);
painter.end();
swapBuffers();
}
void VowelCube::mousePressEvent(QMouseEvent *event)
{
lastPos = event->pos();
}
void VowelCube::mouseMoveEvent(QMouseEvent *event)
{
GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
update();
} else if (event->buttons() & Qt::RightButton) {
rotationX += 180 * dy;
rotationZ += 180 * dx;
update();
}
lastPos = event->pos();
}
void VowelCube::wheelEvent(QWheelEvent *event)
{
double numDegrees = -event->delta() / 8.0;
double numSteps = numDegrees / 15.0;
scaling *= std::pow(1.125, numSteps);
update();
}
void VowelCube::createGradient()
{
gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
gradient.setCenter(0.45, 0.50);
gradient.setFocalPoint(0.40, 0.45);
gradient.setColorAt(0.0, QColor(105, 146, 182));
gradient.setColorAt(0.4, QColor(81, 113, 150));
gradient.setColorAt(0.8, QColor(16, 56, 121));
}
void VowelCube::createGLObject()
{
makeCurrent();
glShadeModel(GL_FLAT);
glObject = glGenLists(1);
glNewList(glObject, GL_COMPILE);
qglColor(QColor(255, 239, 191));
glLineWidth(1.0);
glBegin(GL_LINES);
glVertex3f(+1.0, +1.0, -1.0);
glVertex3f(-1.0, +1.0, -1.0);
glVertex3f(+1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(+1.0, -1.0, +1.0);
glVertex3f(-1.0, -1.0, +1.0);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(+1.0, +1.0, +1.0);
glVertex3f(+1.0, +1.0, -1.0);
glVertex3f(+1.0, -1.0, -1.0);
glVertex3f(+1.0, -1.0, +1.0);
glVertex3f(+1.0, +1.0, +1.0);
glVertex3f(-1.0, +1.0, +1.0);
glVertex3f(-1.0, +1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, +1.0);
glVertex3f(-1.0, +1.0, +1.0);
glEnd();
glEndList();
}
void VowelCube::drawBackground(QPainter *painter)
{
painter->setPen(Qt::NoPen);
painter->setBrush(gradient);
painter->drawRect(rect());
}
void VowelCube::drawCube()
{
makeCurrent();
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
GLfloat x = 3.0 * GLfloat(width()) / height();
glOrtho(-x, +x, -3.0, +3.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0, 0.0, -10.0);
glScalef(scaling, scaling, scaling);
glRotatef(rotationX, 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);
glRotatef(rotationZ, 0.0, 0.0, 1.0);
glEnable(GL_MULTISAMPLE);
glCallList(glObject);
setFont(QFont("Times", 24));
qglColor(QColor(255, 223, 127));
renderText(+1.1, +1.1, +1.1, QChar('a'));
renderText(-1.1, +1.1, +1.1, QChar('e'));
renderText(+1.1, +1.1, -1.1, QChar('o'));
renderText(-1.1, +1.1, -1.1, QChar(0x00F6));
renderText(+1.1, -1.1, +1.1, QChar(0x0131));
renderText(-1.1, -1.1, +1.1, QChar('i'));
renderText(+1.1, -1.1, -1.1, QChar('u'));
renderText(-1.1, -1.1, -1.1, QChar(0x00FC));
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
}
void VowelCube::drawLegend(QPainter *painter)
{
const int Margin = 11;
const int Padding = 6;
QTextDocument textDocument;
textDocument.setDefaultStyleSheet("* { color: #FFEFEF }");
textDocument.setHtml("<h4 align=\"center\">Vowel Categories</h4>"
"<p align=\"center\"><table width=\"100%\">"
"<tr><td>Open:<td>a<td>e<td>o<td>ö"
"<tr><td>Close:<td>ı<td>i<td>u<td>ü"
"<tr><td>Front:<td>e<td>i<td>ö<td>ü"
"<tr><td>Back:<td>a<td>ı<td>o<td>u"
"<tr><td>Round:<td>o<td>ö<td>u<td>ü"
"<tr><td>Unround:<td>a<td>e<td>ı<td>i"
"</table>");
textDocument.setTextWidth(textDocument.size().width());
QRect rect(QPoint(0, 0), textDocument.size().toSize()
+ QSize(2 * Padding, 2 * Padding));
painter->translate(width() - rect.width() - Margin,
height() - rect.height() - Margin);
painter->setPen(QColor(255, 239, 239));
painter->setBrush(QColor(255, 0, 0, 31));
painter->drawRect(rect);
painter->translate(Padding, Padding);
textDocument.drawContents(painter);
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt:自己修改的VowelCube
共4个文件
cpp:2个
pro:1个
h:1个
4星 · 超过85%的资源 需积分: 33 110 下载量 25 浏览量
2013-01-12
12:57:57
上传
评论
收藏 2KB 7Z 举报
温馨提示
大名鼎鼎的Qt教程《C++GUI Programming with Qt 4, secondedition》源代码出现了错误。VowelCube例子在我的计算机(Ubuntu和Windows8)无法运行。Ubuntu下无法显示三维图形,Windows8显示出现错误而崩溃。 后来查看了相关的论坛,我了解了怎样修改这个例子使其顺利地运行。 相关博客地址(http://blog.csdn.net/jiangcaiyang123/article/details/8495932)
资源推荐
资源详情
资源评论
收起资源包目录
Qt:自己修改的VowelCube.7z (4个子文件)
Qt:自己修改的VowelCube
main.cpp 447B
Qt:自己修改的VowelCube.pro 89B
vowelcube.cpp 5KB
vowelcube.h 730B
共 4 条
- 1
资源评论
- xin520hua2013-07-09还可以吧,用了还不错
- qjwzyrjt2019-01-03非常不错的资源啊
彩阳
- 粉丝: 2169
- 资源: 102
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功