您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记1

2014-08-02 12:00 141 查看
学习出处:

/article/4120331.html

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

Qt学习之路(1):前言

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

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


直接在Debug文件下,运行.exe文件,需要QtCore4.dll,QtCored4.dll,QtGui4.dll,QtGuid4.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简单得多。以后我们会看到,这种信号槽的定义也异常的简单。值得注意的是,这个信号槽机制仅仅是使用的QObject的connect函数,其他并没有什么耦合——也就是说,完全可以利用这种机制实现你自己的信号监听!

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的帮助;最后一个是Qt的API文档,在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是由rightLayout的addStretch()添加的,就像弹簧一样,把上面的组件//“顶起来”。
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()信号时,FindDialog的close()函数会被调用。注意,connect()函数也是QObject的,因为我们继承了QObject,所以能够直接使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: