Qt学习笔记1——学习《C++ GUI Qt4》
时间:2011-05-30 来源:xfate
Qt学习笔记1——学习《C++ GUI Qt4》
1.显示中文和和一个label
#include <QtGUI/QApplication>
#include <QtGUI/QLabel>
#include <Qt/qtextcodec.h>
int main(int argc,char * argv[])
{
//设置tr()的编码为gbk
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
//创建一个QApplication对象,管理应用程序的资源
QApplication app(argc,argv);
//创建Label
QLabel *label = new QLabel(QObject::tr("Qt哈哈"));
//显示label
label->show();
//返回到事件循环状态
return app.exec();
}
label支持html格式:
new QLabel(QObject::tr("<i>Qt哈哈</i><br>"));
2.信号与槽
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]
用法:
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
sender和receiver是指向Qobject的指针,signal和slot是不带参数的函数名。
SINGAL()和SLOT()宏会把它们的参数转换为相应的字符串。第一个参数是发送的对象, 第二个参数和第四个参数分别要用signal和slot这两个宏来指定。第三个参数是接受的对象
1.一个信号可以连接多个槽;(调用槽的顺序不定)
2. 一个信号可以与另外的信号相连
3.多个信号可以连接多个槽。
4.连接可以被移除.disconnect
要把信号成功连接到槽,它们必须要有相同的顺序和相同的类型。但是如果信号的参数比槽的参数多,多余的参数将比忽略掉。
3. 点击按钮后退出程序
//显示一个按钮,点击按钮后退出程序
QPushButton * bt = new QPushButton(QPushButton::tr("退出"));
QObject::connect(bt,SIGNAL(clicked()),&app,SLOT(quit()));
bt->show();
上面例子中,按下按钮发出clicked信号,信号和槽slot相连,Qapplication对象接收到后,quit()槽会自动运行。
4.窗口部件的布局:
例子:
#include <QtGUI/QSlider>
#include <QtGUI/QSpinBox>
#include <QtGUI/QHBoxLayout>
QWidget * window = new QWidget();
window->setWindowTitle("age");
QSpinBox * spinbox = new QSpinBox();
QSlider * slider = new QSlider(Qt::Horizontal);
spinbox->setRange(0,130);
slider->setRange(0,130);
QObject::connect(spinbox,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));
QObject::connect(slider,SIGNAL(valueChanged(int)),spinbox,SLOT(setValue(int)));
spinbox->setValue(35);
QHBoxLayout * boxlayout = new QHBoxLayout();
boxlayout->addWidget(spinbox);
boxlayout->addWidget(slider);
window->setLayout(boxlayout);
window->show();
QHBoxLayout 水平分布
QVBoxLayout 垂直分布
QGridLayout 把各个窗口控件排列在一个网格中。
5.Meta-Object系统
利用Qt的信号槽机制,就可以把彼此独立的模块相互连接起来,不需要实现知道模块的任何细节。
为了达到这个目的,Qt提出了一个Meta-Object系统。它提供了两个关键的作用:信号槽和内省。内省又称为反射,允许程序在运行时获得类的相关信息,也就是meta-information。什么是meta-information呢?举例来说,像这个类叫什么名字?它有什么属性?有什么方法?它的信号列表?它的槽列表?等等这些信息,就是这个类的meta-information,也就是"元信息"。
Qt有个独立的工具,moc,通过定义Q_OBJECT宏实现到标准C++函数的转变。moc使用纯C++实现的,因此可以在任何编译器中使用。
机制工作过程:
首先,Q_OBJECT宏声明了一些QObject子类必须实现的内省的函数,如metaObject(),tr(),qt_metacall()等;
第二,Qt的moc工具实现Q_OBJECT宏声明的函数和所有信号;
第三,QObject成员函数connect()和disconnect()使用这些内省函数实现信号槽的连接。
以上这些过程是qmake,moc和QObject自动处理的。
6.利用QtDesigner 来生成程序
运行:
QApplication app(argc,argv);
Ui::qt11Class ui;
QDialog * m = new QDialog;
ui.setupUi(m);
m->show();
return app.exec();
怎么让这些组件可以具有相当的功能?
简单的方法是同时从QDialog和Ui::qt11Class 继承出来,通过它来实现缺失的功能,命名惯例是和ui所产生的类具有相同的名字,只是没有ui的前缀而已。
class qt11Class : public QDialog,public Ui::qt11Class
{
Q_OBJECT
public:
qt11Class(QWidget * parent = 0);
private slots:
void on_lineEdit_textChanged();
};
qt11Class::qt11Class(QWidget * parent)
:QDialog(parent)
{
setupUi(this);
QRegExp regExp("[A-Za-z][1-9]{0,2}");
lineEdit->setValidator(new QRegExpValidator(regExp,this));
connect(okButton,SIGNAL(clicked()),this,SLOT(accept()));
connect(cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
}
void qt11Class::on_lineEdit_textChanged()
{
okButton->setEnabled(lineEdit->hasAcceptableInput());
}
在构造函数中, setupUi(this)用来初始化窗口,setupUi还会吧那些符合
on_objectName_signalName()的任意槽与相应的objectName的signalName的信号连接在一起 。在上面的例子里,setupUi函数建立了如下的 信号-槽连接关系.
connect(lineEdit,SIGNAL(textChanged(const Qstring &)),
this,SLOT(on_lineEdit_textChanged()));
lineEdit->setValidator(new QRegExpValidator(regExp,this));
把this传递给QregExpValidator,使当前的对象成为QregExpValidator的父对象。这样,当删除QregExpValidator的父对象时,也会删除了子对象。
Qt的父子对象机制是在Qobject中实现的。当利用一个父对象创建了一个子对象时,父对象会将子对象加入自己的子对象列表里。当父对象被删除时,它会遍历列表,一一删除子对象。所以在qt里,需要明确删除的对象是new出来而且没有父对象的对象。
connect(okButton,SIGNAL(clicked()),this,SLOT(accept()));
connect(cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
把ok按钮和cancel按钮分别连接到accept槽和reject槽,accept槽把对话框的返回结果设为Qdialog::Accepted(结果是1),reject返回的结果是Qdialog::Rejected(结果是0)
7.常用控件:
QPushButton
The QPushButton widget provides a command button
QToolButton.
The QToolButton class provides a quick-access button to commands or options, usually used inside a QToolBar
QcheckBox
QRadioButton