Qt学习笔记1

学习出处:

http://devbean.blog.51cto.com/448512/193918

非常感谢FinderCheng于豆子空间的分享!分享快乐!

 

 

 

Qt学习之路(1):前言

再来看Qt,和wxWidget一样,它也是一个标准的C++。但是它的语法很类似于JavaSwing,十分清晰,而且SIGNAL/SLOT机制使得程序看起来很明白——这也是我首先选择Qt的一个很重要的方面,因为我是学Java出身的 :) 。不过,所谓“成也萧何,败也萧何”,这种机制虽然很清楚,但是它所带来的后果是你需要使用Qtqmake对程序进行预处理,才能够再使用make或者nmake进行编译。并且它的界面也不是原生风格的,尽管Qt使用style机制十分巧妙的模拟了本地界面。另外值得一提的是,Qt不仅仅运行在桌面环境中,Qt已经被Nokia收购,它现在已经会成为Symbian系列的主要界面技术——Qt是能够运行于嵌入式平台的。

Qt学习之路(2)Hello, world!

 

 

直接在Debug文件下,运行.exe文件,需要QtCore4.dllQtCored4.dllQtGui4.dllQtGuid4.dll

Qt学习之路(3)Hello, world!()

引入的头文件:

Qt中头文件和类名是一致的。也就是说,如果你要使用某个类的话,它的类名就是它的头文件名。

如:

#include <QtGui/QApplication>

#include <QLabel>

明确一下Qt的程序结构,在一个Qt源代码中,一下两条语句是必不可少的:

QApplication a(argc, argv);

return a.exec();

 

//QLabel*label = new QLabel("Hello, world!");

QLabel *label = new QLabel("<h2><fontcolor='red'>Hello</font>, world!<h2>");

创建一个QLabel对象,并且能够显示Hello, world!字符串。和其他库的Label控件一样,这是用来显示文本的。在Qt中,这被称为一个widget(翻译出来是小东西,不过这个翻译并不好…),它等同于Windows技术里面的控件(controls)和容器(containers)。也就是说,widget可以放置其他的widget,就像Swing的组件。大多数Qt程序使用QMainWindow或者QDialog作为顶级组件,但Qt并不强制要求这点。在这个例子中,顶级组件就是一个QLabel

Qt学习之路(4):初探信号槽

所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座。怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这个组件就会发出一个信号。就像是广播一样,如果有了事件,它就漫天发声。这时,如果有一个槽,正好对应上这个信号,那么,这个槽的函数就会执行,也就是回调。就像广播发出了,如果你感兴趣,那么你就会对这个广播有反应。

Qt使用信号槽机制完成了事件监听操作。这类似与Swing里面的listener机制,只是要比这个listener简单得多。以后我们会看到,这种信号槽的定义也异常的简单。值得注意的是,这个信号槽机制仅仅是使用的QObjectconnect函数,其他并没有什么耦合——也就是说,完全可以利用这种机制实现你自己的信号监听!

QApplication a(argc, argv); 
        QPushButton*button = new QPushButton("Quit"); 
        QObject::connect(button, SIGNAL(clicked()),&a, SLOT(quit())); 
        button->show(); 
        return a.exec(); 

 

Qt学习之路(5):组件布局

绝对定位和布局定位:

顾名思义,绝对定位就是使用最原始的定位方法,给出这个组件的坐标和长宽值。这样,Qt就知道该把组件放在哪里,以及怎么设置组件的大小了。但是这样做的一个问题是,如果用户改变了窗口大小,比如点击了最大化或者拖动窗口边缘,这时,你就要自己编写相应的函数来响应这些变化,以避免那些组件还只是静静地呆在一个角落。或者,更简单的方法是直接禁止用户改变大小。

Qt提供了另外的一种机制,就是布局,你只要把组件放入某一种布局之中,当需要调整大小或者位置的时候,Qt就知道该怎样进行调整。这类似于Swing的布局管理器,不过Qt的布局没有那么多,只有有限的几个。

Qt一共有三种主要的layout,分别是:

QHBoxLayout- 按照水平方向从左到右布局;

QVBoxLayout- 按照竖直方向从上到下布局;

QGridLayout- 在一个网格中进行布局,类似于HTML的table。

layout使用addWidget添加组件,使用addLayout可以添加子布局。

Main函数代码

     QApplication app(argc, argv);

    QWidget *window = new QWidget;

    window->setWindowTitle("Enteryour age"); //设置窗口标题

     QSpinBox*spinBox = newQSpinBox;

    QSlider *slider = new QSlider(Qt::Horizontal);

    spinBox->setRange(0, 130); //设定变化范围

    slider->setRange(0, 130);

    QObject::connect(slider,SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));

    QObject::connect(spinBox,SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

    spinBox->setValue(35); //设定初始值

    QHBoxLayout *layout= new QHBoxLayout;    //水平布局

    layout->addWidget(spinBox);

    layout->addWidget(slider);

    window->setLayout(layout);

    window->show();

    return app.exec();

 

 

Qt学习之路(6): API文档的使用

Qt中查看文档是一件很简单的事情。如果你使用QtCreator,那么左侧的Help按钮就是文档查看入口。否则的话,你可以在Qt的安装目录下的bin里面的assistant.exe中看到Qt的文档。

 

其中,第一个是帮助的帮助:-);第二个是Qt Designer的帮助;第三个是Qt Linguist的帮助;第四个是QMake的帮助;最后一个是QtAPI文档,在QtCreator中默认打开的就是这部分。

 

Qt学习之路(7): 创建一个对话框()

 

.h头文件需要用到的组件类声明:

class QCheckBox;

class QLabel;

class QLineEdit;

class QPushButton;

 

class FindDialog : public QDialog

{

    Q_OBJECT    // Q_OBJECT。这是一个宏。凡是定义信号槽的类都必须声明这个宏。

 

public:

    FindDialog(QWidget *parent= 0, Qt::WFlagsflags = 0);

    ~FindDialog();      //构造函数与析构函数

 

private:

    Ui::FindDialogClass ui;

 

signals:        //信号,关键字,无类型

    void findNext(const QString &str,Qt::CaseSensitivitycs);

    void findPrevious(constQString &str,Qt::CaseSensitivitycs);

//private slots:的定义,和前面的signal一样,这是私有的槽的定义。也就是说,//FindDialog具有两个槽,可以接收某些信号,不过这两个槽都是私有的。

//为了slots的定义,我们需要访问FindDialog的组件,因此,我们把其中的组件定义为//成员变量以便访问。正是因为需要定义这些组件,才需要对它们的类型进行前向声明。

 

private slots:

        void findClicked(); //点击

        void enableFindButton(constQString &text);     //使能按钮

private:

    QLabel *label;

    QLineEdit*lineEdit;

    QCheckBox*caseCheckBox;

    QCheckBox*backwardCheckBox;

    QPushButton*findButton;

    QPushButton*closeButton;

};

 

 

Qt学习之路(8): 创建一个对话框()

main.cpp主函数文件

#include "finddialog.h"

#include <QtGui/QApplication>

int main(int argc, char *argv[])

{

    QApplicationa(argc, argv);

    //FindDialog w;     //其实系统已自带创建显示查找对话框,这里可以不用修改

    //w.show();

    FindDialog*dialog = newFindDialog;

    dialog->show();

    return a.exec();

}

 

finddialog.cpp源文件

#include "finddialog.h"

#include <QtGui>            //手动添加头文件

 

FindDialog::FindDialog(QWidget *parent,Qt::WFlagsflags)

    : QDialog(parent,flags)    //构造函数系统生成

{

   

    label = new QLabel(tr("Find &what:"));

    lineEdit = new QLineEdit;

    label->setBuddy(lineEdit); //获得输入焦点

 

    caseCheckBox = newQCheckBox(tr("Match &case"));

    backwardCheckBox = newQCheckBox(tr("Search &backford"));

 

    findButton = new QPushButton(tr("&Find"));

    findButton->setDefault(true);

    findButton->setEnabled(false); //使能按钮

 

    closeButton = new QPushButton(tr("Close"));

//connect语句,用来连接信号槽。

    connect(lineEdit,SIGNAL(textChanged(const QString&)),this, SLOT(enableFindButton(constQString&)));

    connect(findButton,SIGNAL(clicked()),this, SLOT(findClicked()));

    connect(closeButton,SIGNAL(clicked()),this, SLOT(close()));

    //水平布局和竖直布局

    QHBoxLayout *topLeftLayout= new QHBoxLayout;

    topLeftLayout->addWidget(label);

    topLeftLayout->addWidget(lineEdit);

 

    QVBoxLayout *leftLayout= new QVBoxLayout;

    leftLayout->addLayout(topLeftLayout);

    leftLayout->addWidget(caseCheckBox);

    leftLayout->addWidget(backwardCheckBox);

 

    QVBoxLayout *rightLayout= new QVBoxLayout;

    rightLayout->addWidget(findButton);

    rightLayout->addWidget(closeButton);

//注意那个spacer是由rightLayoutaddStretch()添加的,就像弹簧一样,把上面的组件//“顶起来”。

rightLayout->addStretch();

 

    QHBoxLayout *mainLayout= new QHBoxLayout;

    mainLayout->addLayout(leftLayout);

    mainLayout->addLayout(rightLayout);

    setLayout(mainLayout);

//窗口标题

    setWindowTitle(tr("Find"));

//setFixedHeight()是设置成固定的高度,其参数值sizeHint()返回“最理想”的大小,这//里我们使用的是height()函数去到“最理想”的高度。

    setFixedHeight(sizeHint().height());

    ui.setupUi(this);

}

FindDialog::~FindDialog()       //默认构造函数

{

 

}

void FindDialog::findClicked()

{

    QString text = lineEdit->text();

    Qt::CaseSensitivitycs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive;

    if(backwardCheckBox->isChecked()) {

        emit findPrevious(text, cs);

    } else {

        emit findNext(text, cs);

    }

}

 

void FindDialog::enableFindButton(constQString &text)

{

    findButton->setEnabled(!text.isEmpty());

}

 

然后新建一个QLabel。还记得前面的Hello, world!里面也使用过QLabel吗?那时候只是简单的传入一个字符串啊!这里怎么是一个函数tr()?函数tr()全名是QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用。这以后还会仔细讲解,只要记住,Qt的最佳实践:如果你想让你的程序国际化的话,那么,所有用户可见的字符串都要使用QObject::tr()但是,为什么我们没有写QObject::tr(),而仅仅是tr()呢?原来,tr()函数是定义在Object里面的,所有使用了Q_OBJECT宏的类都自动具有tr()函数。

 

字符串中的&代表快捷键。注意看下面的findButton&Find,它会生成Find字符串,当你按下Alt+F的时候,这个按钮就相当于被点击——这么说很难受,相信大家都明白什么意思。同样,前面label里面也有一个&,因此它的快捷键就是Alt+W。不过,这个label使用了setBuddy函数,它的意思是,当label获得焦点时,比如按下Alt+W,它的焦点会自动传给它的buddy,也就是lineEdit。看,这就是伙伴的含义(buddy英文就是伙伴的意思)

 

编写槽了——虽然说是slot,但实际上它就是普通的函数,既可以和其他函数一样使用,又可以被系统回调。

 

closeButton发出clicked()信号时,FindDialogclose()函数会被调用。注意,connect()函数也是QObject的,因为我们继承了QObject,所以能够直接使用。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值