Qt学习笔记(Qt3库)(http://blog.sina.com.cn/2010vw)

本文档详细介绍了Qt初学者如何从创建基本窗口开始,逐步掌握按钮、标签、信号槽机制及自定义槽等核心概念,最终实现动画效果的展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt学习笔记(Qt3库)

//**************************************************************

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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值