
** main.cpp
**
****************************************************************/
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv )
QPushButton hello( "Hello world!", 0 )
hello.resize( 100, 30 )
a.setMainWidget( &hello )
hello.show()
return a.exec()
}
用 vi 和 gedit 等编辑工具编辑这个 main.cpp 文件,
保存到一个单独的目录,比如说 /root/helloworld
上面我们看到了程序运行效果,下面我们来一行一行地解说源程序:
#include <qapplication.h>
这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和旁岩光标。
#include <qpushbutton.h>
这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。
QPushButton是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。
int main( int argc, char **argv )
{
main()函数是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。
argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt专有的,无论如何Qt需要处理这些变量(请看下面)。
QApplication a( argc, argv )
a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。关于细节请看QApplication::argv()文档。
注意:在任何Qt的窗口系辩棚统部件被使用之前创建QApplication对象是必须的。
QPushButton hello( "Hello world!", 0 )
这里,在QApplication之后,接着的是第一个窗口系统代码:一个按钮被创建了。
这个按钮被设置成显示“Hello world!”并且它自己构成了一个窗口(因为在构造函数指定0为它的父窗口,在这个父窗口中按钮被定位)。
hello.resize( 100, 30 )
这个按扭被设置成100像素宽,30像素高(加上窗运灶御口系统边框)。在这种情况下,我们不用考虑按钮的位置,并且我们接受默认值。
a.setMainWidget( &hello )
这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。
我们不用必须设置一个主窗口部件,但绝大多数程序都有一个。
hello.show()
当我们创建一个窗口部件的时候,它是不可见的。我们必须调用show()来使它变为可见的。
return a.exec()
这里就是main()把控制转交给Qt,并且当应用程序退出的时候exec()就会返回。
在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
}
我们现在可以试着编译和运行这个程序了。
编译
编译一个C++应用程序,我们需要创建一个makefile。创建一个Qt的makefile的最容易的方法是使用Qt提供的连编工具qmake。如果我们已经把main.cpp保存到它自己的目录了,我们所要做的就是这些:
qmake -project
qmake
第一个命令调用qmake来生成一个.pro(项目)文件。第二个命令根据这个项目文件来生成一个(系统相关的)makefile。我们现在可以输入make(或者nmake,如果我们使用Visual Studio),然后运行我们的第一个Qt应用程序!
make
行为
当我们运行它的时候,我们就会看到一个被单一按钮充满的小窗口,在它上面我们可以读到著名的词:
Qt Creator中的3D绘图及动画教程(参照NeHe)刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用OpenGL进行绘图渲染。虽然里面还是由不少专业的解释照搬原文的,但还是加入了大量自己的分析。而且Qt中写OpenGL框架上比VC简单太多了,有不少东西都封装优化好了,代码上还是由有很多区别的。当然,其中原教程没解释好的问题我都作了深入的解释,以及一些多余岁宏部分解释、代码都被我删掉简化了。
这份Qt OpenGL的3D绘图及动画教程,我基本会按照Nehe的OpenGL教程,只是将代码的实现运用到Qt Creator中,当然其中加了。
下面对Qt中OpenGL做一个简要介绍:
Qt中OpenGL主要是在QGLWidget类中完成的,而要使用QtOpenGL模块,需要在漏顷项目文件( .pro)中添加代码"QT+=opengl"。
QGLWidget类是一个用来渲染OpenGL图形的部件,提供了在Qt中显示OpenGL图形的功能。这个类使用起来很简单,只需要继承该类,然后像使用其他QWidget部件一样来使用它。QGLWidget提供了3个方便的纯虚函数,可以在子类中通过重新实现它们来执行典型的OpenGL任务:
initializeGL():设置OpenGL渲染环境,定义显示列表等。该函数只在第一次调用resizeGL()或paintGL()前被自动调用一次。
resizeGL():设置OpenGL的视口、投影等。每返雀陆次部件改变大小时都会自动调用该函数。
paintGL():渲染OpenGL场景。每当部件需要更新时都会调用该函数。
(以上3个虚函数更具体的调用情况我会用另一篇文章来讲明)
也就是说,Qt中当创建并显示出一个QGLWidget子对象时,会自动依次调用initializeGL()、resizeGL()、paintGL(),完成当前场景的绘制;而当某些情况发生时,会根据情况决定是否自动调用initializeGL()、resizeGL(),一旦调用initializeGL()、resizeGL()了,会紧跟着调用paintGL()对场景进行重新绘制。
#ifndef MYWIDGET_H#define MYWIDGET_H
#include <QWidget>
#include <QtGui>
#include <QMouseEvent>
class MyWidget : public QWidget
{
public:
MyWidget()
void mousePressEvent(QMouseEvent *event)
void mouseMoveEvent(QMouseEvent *event)
void mouseReleaseEvent(QMouseEvent *event)
void paintEvent(QPaintEvent *event)
private:
QPoint m_PointStart
QPoint m_PointEnd
}
#endif // MYWIDGET_H
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "mywidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv)
庆闭MyWidget widget
widget.show()
返手 return a.exec()
}
#include "mywidget.h"
MyWidget::MyWidget()
{
resize(240,320)
}
void MyWidget::mousePressEvent(QMouseEvent *event)
{
m_PointStart = event->pos()
}
void 漏差嫌MyWidget::mouseMoveEvent(QMouseEvent *event)
{
//m_PointEnd = event->pos()
//update()
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
m_PointEnd = event->pos()
update()
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this)
painter.setBrush(QBrush(QColor(255,0,0)))
painter.drawPixmap(0,0,240,320,QPixmap("images/frame1.jpg"))
if(m_PointStart.x() < m_PointEnd.x())
painter.drawPixmap(0,0,240,320,QPixmap("images/frame2.jpg"))
else if(m_PointStart.x() > m_PointEnd.x())
painter.drawPixmap(0,0,240,320,QPixmap("images/frame3.jpg"))
}
在网上找到了一个很好的类子,一看就明白
转自:http://www.cppblog.com/qianqian/archive/2012/05/21/121418.html
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)