分类: C/C++
2011-10-11 10:30:31
创建主部件的方法是基于QWidget或QDialog类创建一个用户类。可以使用用户类通过公有继承派生于QWidget类,在其中调用一些成员函数来定义窗口外观。
题目要求:创建一个空的窗口,并显示在屏幕上。大小为200*120.窗口大小不可调整。
源程序:3-1.cpp
#include
#include
#include
#include
//在类的声明里,我们只
//需要包含新的成员。其它的
//方法都从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
#include
#include
#include
//在类的声明里,我们只
//需要一个新的构造函数。
//其它的成员都是从类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
#include
#include
#include
#include
#include
//在类的声明里,我们只
//需要一个新的构造函数。
//其它的成员都是从类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
#include
#include
#include
#include
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!"<
}
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();
}
//**************************************************************