//**************************************************************
3.1创建第一个主部件
创建主部件的方法是基于QWidget或QDialog类创建一个用户类。可以使用用户类通过公有继承派生于QWidget类,在其中调用一些成员函数来定义窗口外观。
题目要求:创建一个空的窗口,并显示在屏幕上。大小为200*120.窗口大小不可调整。
源程序:3-1.cpp
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qlabel.h>
//在类的声明里,我们只
//需要包含新的成员。其它的
//方法都从QWidget类中继承来:
class MyMainWindow:public QWidget
{
QPushButton *b;
QLabel *l;
public:
MyMainWindow();
};
MyMainWindow::MyMainWindow()
{
//设置窗口的最大、最小尺寸
//我们不需要添加this指针,
//因为C++默认是现在的类
setMinimumSize(400,300);
setMaximumSize(400,300);
b=new QPushButton("hello world!",this);
b->setGeometry(20,20,160,80);
l=new QLabel("label",this);
l->setGeometry(100,90,160,93);
}
int main(int argc,char **argv)
{
//创建要求的应用类对象a
QApplication a(argc,argv);
//创建MyMainWindow类的对象,
//并设置其为主视图
MyMainWindow w;
a.setMainWidget(&w);
//显示主窗口对象,并且
//它的子视图也会显示到屏幕
w.show();
//等待用户命令
a.exec();
}
//**************************************************************
QT库与用户的交互方式,例如按钮、滑块,是通过使用信号和槽。信号和槽是相互关联的函数
题目要求:添加退出按钮
3-5.cpp
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qlabel.h>
//在类的声明里,我们只
//需要一个新的构造函数。
//其它的成员都是从类QWidget中继承来的:
class MyMainWindow:public QWidget
{
QPushButton *b;
QLabel *l;
public:
MyMainWindow();
};
MyMainWindow::MyMainWindow()
{
setGeometry(100,100,200,170);
//setMinimumSize(400,300);
//setMaximumSize(400,300);
b=new QPushButton("Quit!",this);
b->setGeometry(20,20,160,80);
b->setFont(QFont("Times",18,QFont::Bold));
l=new QLabel(this);
l->setGeometry(10,110,180,50);
l->setText("If you click the button above,
/nthe whole program will exit");
l->setAlignment(AlignCenter);
//这里按钮b的clicked()信号与qApp的槽quit()链接,当点击按钮时,将产生QPushButton::clicked()信号,导致qApp的quit()槽被执行,从而程序退出。
那么,什么是qApp呢?qApp是Qt的一个内置指针。它总是指向程序中的QApplication对象(这里指a)。//
connect(b,SIGNAL(clicked()),qApp,SLOT(quit()));
}
int main(int argc,char **argv)
{
QApplication a(argc,argv);
MyMainWindow w;
a.setMainWidget(&w);
w.show();
return a.exec();
}
//**************************************************************
信号和槽的使用
题目要求:利用滑块来改变LCD显示的值
4-1.cpp
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qfont.h>
#include <qlcdnumber.h>
#include <qslider.h>
//在类的声明里,我们只
//需要一个新的构造函数。
//其它的成员都是从类QWidget中继承来的:
class MyMainWindow:public QWidget
{
QPushButton *b;
QLCDNumber *lcd;
QSlider *slider;
public:
MyMainWindow();
};
MyMainWindow::MyMainWindow()
{
setGeometry(100,100,300,200);
//setMinimumSize(400,300);
//setMaximumSize(400,300);
b=new QPushButton("Quit!",this);
b->setGeometry(10,20,80,40);
b->setFont(QFont("Times",18,QFont::Bold));
lcd=new QLCDNumber(2,this);
lcd->setGeometry(100,10,190,180);
slider=new QSlider(Vertical,this);
slider->setGeometry(10,60,80,130);
//下面一行代码,使点击按键1,程序退出
connect(b,SIGNAL(clicked()),qApp,SLOT(quit()));
//下面一行链接滑块和显示器,使数字随着滑块的移动而改变
connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)));
}
int main(int argc,char **argv)
{
QApplication a(argc,argv);
MyMainWindow w;
a.setMainWidget(&w);
w.show();
return a.exec();
}
//**************************************************************
用户自定义槽,需另外把自定义类做成声明函数,类中成员函数的实现可放在源函数里。
4-3.h(类的声明)
#include <iostream.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qfont.h>
class MyMainWindow:public QWidget
{
//这个宏定义是不可缺少的
Q_OBJECT;
//用户自定义槽
public slots:
void SetValue();
void ChangeValue();
//用户自定义信号
signals:
void ValueChanged();
//定义两个数据成员
private:
QPushButton *b1;
QPushButton *b2;
//构造函数
public:
MyMainWindow();
};
类的函数成员的实现在源程序中
4-3.cpp(源程序)
#include <4-3.h>
void MyMainWindow::SetValue()
{
//向自定义信号发送信号
emit ValueChanged();
}
void MyMainWindow::ChangeValue()
{
cout<<"test!"<<endl;
}
MyMainWindow::MyMainWindow()
{
//设置主窗口大小
setGeometry(100,100,300,200);
//按键1:设置其标识符Print,
//和坐标位置、几何大小,
//第三句设置字体:
b1=new QPushButton("Print!",this);
b1->setGeometry(10,20,80,40);
b1->setFont(QFont("Times",18,QFont::Bold));
//按键1:设置其标识符Quit,
//和坐标位置、几何大小,
//第三句设置字体:
b2=new QPushButton("Quit!",this);
b2->setGeometry(10,80,80,40);
b2->setFont(QFont("Times",18,QFont::Bold));
//ValueChanged收到信号,就给自定义槽发送信号,ChangeValue则打印字符串
connect(this,SIGNAL(ValueChanged()),this,SLOT(ChangeValue()));
//点击1按键,向自定义槽发送信号
connect(b1,SIGNAL(clicked()),this,SLOT(SetValue()));
//点击2按键,程序退出
connect(b2,SIGNAL(clicked()),qApp,SLOT(quit()));
}
int main(int argc,char **argv)
{
//定义一个应用类对象
QApplication a(argc,argv);
//定义一个应用类对象
MyMainWindow w;
//设置w为主窗口
a.setMainWidget(&w);
//显示w
w.show();
return a.exec();
}
9-1.cpp
#include <qapplication.h>
#include <qwidget.h>
#include <qpainter.h>
class MyMainWindow:public QWidget
{
public:
MyMainWindow();
private:
void paintEvent(QPaintEvent *);
QPainter *paint;
};
//此函数是由系统调用的,每当第一次生成或被挡住,它都会再次被调用
void MyMainWindow::paintEvent(QPaintEvent *)
{
//此句最好做成局部变量的定义,否则将导致重复申请动态内存
paint=new QPainter;
paint->begin(this);
//设置边框颜色、线形和线的宽度
paint->setPen(QPen(blue,10,QPen::SolidLine));
//设置边框内部颜色全部填充为红色
paint->setBrush(QBrush(red,SolidPattern));
//绘制矩形
paint->drawRect(20,20,160,160);
//绘图介绍
paint->end();
}
MyMainWindow::MyMainWindow()
{
//设置主窗口坐标位置、大小
setGeometry(100,100,200,200);
}
int main(int argc,char **argv)
{
QApplication a(argc,argv);
MyMainWindow w;
a.setMainWidget(&w);
w.show();
a.exec();
}
//**************************************************************
对上一个例子做一个扩展,画一个4*4棋盘
9-1-1.cpp
#include <qapplication.h>
#include <qwidget.h>
#include <qpainter.h>
class MyMainWindow:public QWidget
{
public:
MyMainWindow();
private:
//绘图函数声明
void paintEvent(QPaintEvent *);
QPainter *paint;
};
void MyMainWindow::paintEvent(QPaintEvent *)
{
int i;
int x=20,y=20;
paint=new QPainter;
paint->begin(this);
paint->setPen(QPen(blue,4,QPen::SolidLine));
paint->setBrush(QBrush(white,SolidPattern));
//画5条横线
for(i=0;i<5;i++)
{
paint->drawLine(20,y+80*i,340,y+80*i);
}
//画5条竖线
for(i=0;i<5;i++)
{
paint->drawLine(x+80*i,20,x+80*i,340);
}
在棋盘正中做两个红棋子
paint->setBrush(QBrush(red,SolidPattern));
paint->drawEllipse(100,100,80,80);
paint->drawEllipse(180,180,80,80);
在棋盘正中做两个蓝棋子
paint->setBrush(QBrush(green,SolidPattern));
paint->drawEllipse(180,100,80,80);
paint->drawEllipse(100,180,80,80);
paint->end();
}
MyMainWindow::MyMainWindow()
{
setGeometry(100,100,400,400);
}
int main(int argc,char **argv)
{
QApplication a(argc,argv);
MyMainWindow w;
a.setMainWidget(&w);
w.show();
a.exec();
}
//**************************************************************
在主窗口上加一个标签,在标签上做出一个动画。
15-1.h
#include <qapplication.h>
#include <qwidget.h>
#include <qlabel.h>
#include <qmovie.h>
#include <qpushbutton.h>
#include <qfont.h>
#include <qlayout.h>
class MyMainWindow:public QWidget
{
//宏定义
Q_OBJECT;
public:
MyMainWindow(char *);
QMovie movie; //定义动画的对象
public slots:
void UnPause(); //继续播放
void Pause(); //暂停
void addSpeed(); //加速动画的播放速度
void decSpeed(); //减慢动画的播放速度
private:
unsigned long num;
QLabel *label;
QPushButton *b1;
QPushButton *b2;
QPushButton *b3;
QPushButton *b4;
QPushButton *b5;
};
15-1.cpp
#include "15-1.h"
void MyMainWindow::UnPause()
{
movie.unpause(); //继续播放
}
void MyMainWindow::Pause()
{
movie.pause(); //暂停播放
}
void MyMainWindow::addSpeed()
{
num+=20;
movie.setSpeed(num); //以20%增加速度
}
void MyMainWindow::decSpeed()
{
num-=20;
movie.setSpeed(num); //以20%减少
}
//str里存放动画的文件名
MyMainWindow::MyMainWindow(char *str):movie(str)
{
setGeometry(100,100,300,280);
num=100; //初始速度为100
b1=new QPushButton("Continue!",this);
b1->setGeometry(130,20,120,40);
b1->setMinimumSize(40,20);
b1->setFont(QFont("Times",18,QFont::Bold));
b2=new QPushButton("Pause!",this);
b2->setGeometry(130,70,120,40);
b2->setMinimumSize(40,20);
b2->setFont(QFont("Times",18,QFont::Bold));
b3=new QPushButton("Hurry!",this);
b3->setGeometry(130,120,120,40);
b3->setMinimumSize(40,20);
b3->setFont(QFont("Times",18,QFont::Bold));
b4=new QPushButton("Slow!",this);
b4->setGeometry(130,170,120,40);
b4->setMinimumSize(40,20);
b4->setFont(QFont("Times",18,QFont::Bold));
b5=new QPushButton("Quit!",this);
b5->setGeometry(130,220,120,40);
b5->setMinimumSize(40,20);
b5->setFont(QFont("Times",18,QFont::Bold));
label=new QLabel(this);
label->setGeometry(10,10,120,60);
label->setMovie(movie);
QVBoxLayout *vbox=new QVBoxLayout(this);
vbox->addWidget(label);
vbox->addWidget(b1);
vbox->addWidget(b2);
vbox->addWidget(b3);
vbox->addWidget(b4);
vbox->addWidget(b5);
connect(b1,SIGNAL(clicked()),this,SLOT(UnPause()));
connect(b2,SIGNAL(clicked()),this,SLOT(Pause()));
connect(b3,SIGNAL(clicked()),this,SLOT(addSpeed()));
connect(b4,SIGNAL(clicked()),this,SLOT(decSpeed()));
connect(b5,SIGNAL(clicked()),qApp,SLOT(quit()));
}
int main(int argc,char **argv)
{
QApplication a(argc,argv);
//给构造函数发送动画名,并且文件必须使.gif格式
MyMainWindow w("trolltech.gif");
a.setMainWidget(&w);
w.show();
a.exec();
}