1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>libQGLViewer callback example</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="../qglviewer.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="../images/qglviewer.ico" type="image/x-icon" />
<link rel="icon" href="../images/qglviewer.icon.png" type="image/png" />
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-23223012-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="banner">
<a class="qindex" href="../index.html">Home</a>
<a class="qindex" href="../download.html">Download</a>
<a class="qindex highlight" href="index.html">Gallery</a>
<a class="qindex" href="../refManual/hierarchy.html">Documentation</a>
<a class="qindex" href="../developer.html">Developer</a>
</div>
<h1>The callback example</h1>
<center>
<img src="../images/callback.jpg" width="330" height="228" alt="callback"/>
</center>
<p>
Using the Qt signal-slot mechanism to connect a QGLViewer to your scene.
</p>
<p>
This very simple application uses the Qt signal-slot callback mechanism to link the QGLViewer and
your Scene. The two class hence remain totally independent. The <code>drawNeeded()</code>
QGLViewer signal is connected to the Scene <code>drawScene()</code> slot.
</p>
<h2>callback.h</h2>
<pre>
#include <qobject.h>
class QGLViewer;
// The Scene class must derive from QObject in order to allow a
// signal slot mechanism.
class Scene : public QObject {
Q_OBJECT
public:
Scene(const QGLViewer *const v);
public Q_SLOTS:
void draw();
};
</pre>
<h2>callback.cpp</h2>
<pre>
#include "callback.h"
#include <QGLViewer/qglviewer.h>
#include <math.h>
Scene::Scene(const QGLViewer *const v) {
// Connect the viewer signal to our draw slot.
connect(v, SIGNAL(drawNeeded()), this, SLOT(draw()));
}
// Draws a spiral
void Scene::draw() {
const float nbSteps = 200.0;
glBegin(GL_QUAD_STRIP);
for (float i = 0; i < nbSteps; ++i) {
float ratio = i / nbSteps;
float angle = 21.0 * ratio;
float c = cos(angle);
float s = sin(angle);
float r1 = 1.0 - 0.8 * ratio;
float r2 = 0.8 - 0.8 * ratio;
float alt = ratio - 0.5;
const float nor = .5;
const float up = sqrt(1.0 - nor * nor);
glColor3f(1.0 - ratio, 0.2f, ratio);
glNormal3f(nor * c, up, nor * s);
glVertex3f(r1 * c, alt, r1 * s);
glVertex3f(r2 * c, alt + 0.05, r2 * s);
}
glEnd();
}
</pre>
<h2>main.cpp</h2>
<pre>
#include "callback.h"
#include <QGLViewer/qglviewer.h>
#include <qapplication.h>
#include <qmessagebox.h>
using namespace std;
void help() {
QString text("<h2>C a l l b a c k</h2>");
text += "This example is conceptually the same as simpleViewer.<br>";
text += "The difference is that it uses the Qt signal/slot mechanism ";
text += "instead of deriving the QGLViewer class. ";
text += "The QGLViewer::drawNeeded() signal is connected to the "
"Scene::draw() method. ";
text += "The two classes are otherwise completely independant.";
QMessageBox::information(NULL, "Callback exemple", text);
}
int main(int argc, char **argv) {
QApplication application(argc, argv);
// Instantiate the viewer.
QGLViewer viewer;
// Restore the previous viewer state.
viewer.restoreStateFromFile();
// Create a scene, giving a pointer to the associated viewer.
Scene s(&viewer);
viewer.setWindowTitle("callback");
help();
viewer.show();
return application.exec();
}
</pre>
<p>
Back to the <a href="index.html">examples main page</a>.
</p>
</body>
</html>
|