Qt学习笔记1——学习《C++ GUI Qt4》

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

senderreceiver是指向Qobject的指针,signalslot是不带参数的函数名。

SINGAL()SLOT()宏会把它们的参数转换为相应的字符串。第一个参数是发送的对象, 第二个参数和第四个参数分别要用signalslot这两个宏来指定。第三个参数是接受的对象

 

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

  第二,Qtmoc工具实现Q_OBJECT宏声明的函数和所有信号;

  第三,QObject成员函数connect()disconnect()使用这些内省函数实现信号槽的连接。

以上这些过程是qmakemocQObject自动处理的。

 

6.利用QtDesigner 来生成程序

运行:

    QApplication app(argc,argv);

    Ui::qt11Class ui;

    QDialog * m = new QDialog;

 

    ui.setupUi(m);

    m->show();

    return app.exec();

怎么让这些组件可以具有相当的功能?

简单的方法是同时从QDialogUi::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()的任意槽与相应的objectNamesignalName的信号连接在一起 在上面的例子里,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

 

posted @ 2011-05-30 20:32  xfate  阅读(959)  评论(0编辑  收藏  举报