虽然学习Qt有段时间了,但是总是不得要领,真的是有些郁闷。。。无奈,没有捷径,只有多加练习和看书。最近在网上找到一篇<Qt学习之路(1-60)>感觉很不错。就开始看并且做练习,目前只能按部就班地练习现成的例子,学的很浅。。。。加油。。。记录学习过程,加油!坚持!恩,下面就附上练习的代码和结果(*^_^*):
其实还是主要为了理解信号和槽机制,还有如何布局,恩。。 很重要的。。。要好好学……
下面是一个对话框的例子,学会了就可以自己变通和设计。。。。
-
//dialog.h
-
#ifndef DIALOG_H
-
#define DIALOG_H
-
-
#include <QDialog>
-
-
/*
-
*首先,声明四个用到的类。这里所做的是前向声明,否则就会编译出错,因为编译器不知道这些类是否存在
-
*为了slots的定义,需要访问Dialog的组件,因此就把其中的组件定义为成员变量以便访问。
-
*正是因为需要这些组件,才需要对它们的类型进行前向声明。因为我们仅仅使用的是指针,并不涉及到这些
-
*类的函数,因此并不需要include它们的头文件(当然也可以用引入头文件的方式,不过编译速度要慢些)
-
*/
-
class QCheckBox;
-
class QLabel;
-
class QLineEdit;
-
class QPushButton;
-
-
namespace Ui {
-
class Dialog;
-
}
-
-
class Dialog : public QDialog
-
{
-
Q_OBJECT
-
-
public:
-
explicit Dialog(QWidget *parent = 0);
-
~Dialog();
-
-
signals:
-
//Qt::CaseSensitivity表示对带const QString &str字符串参数的输入的大小写要敏感
-
void findNext(const QString &str, Qt::CaseSensitivity cs);
-
void findPrevious(const QString &str, Qt::CaseSensitivity cs);
-
-
private slots:
-
void findClicked();
-
void enableFindButton(const QString &text);
-
-
private:
-
Ui::Dialog *ui;
-
QLabel *label;
-
QLineEdit *lineEdit;
-
QCheckBox *caseCheckBox;//QCheckBox类提供一个带有文本标签的复选框
-
QCheckBox *backwordCheckBox ;
-
QPushButton *findButton;
-
QPushButton *closeButton;
-
};
-
-
#endif // DIALOG_H
-
//dialog.cpp
-
#include "dialog.h"
-
#include "ui_dialog.h"
-
#include <QtGui>
-
-
Dialog::Dialog(QWidget *parent) :
-
QDialog(parent),
-
ui(new Ui::Dialog) //构造函数有参数初始化列表,用来调用父类的构造函数
-
{
-
ui->setupUi(this);
-
label = new QLabel(tr("Find &what: "));//字符串中的&代表快捷键,该label的快捷键就是Alt+W
-
//不过这个label使用了setBuddy函数,意思是当label获得焦点时(如按下Alt+W)它的焦点会自动传给它的
-
//buddy,也就是lineEdit,这就是伙伴的意思。。。^_^
-
lineEdit = new QLineEdit;
-
label->setBuddy(lineEdit);
-
-
caseCheckBox = new QCheckBox(tr("Match &case"));
-
backwordCheckBox = new QCheckBox(tr("Search &backford"));
-
-
findButton = new QPushButton(tr("&Find"));//会生成Find字符串,当按下Alt+F时,就相当于findButton被点击了
-
findButton->setDefault(true);
-
findButton->setEnabled(false);//把findButton设为不可用
-
-
closeButton = new QPushButton(tr("Close"));
-
-
connect(lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&)));
-
connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
-
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
-
-
-
//后面这些都是layout的使用,编写layout布局最重要的一点就是思路清楚,想清楚哪个套路,就会比较好编写
-
QHBoxLayout *topLeftLayout = new QHBoxLayout;
-
topLeftLayout->addWidget(label);
-
topLeftLayout->addWidget(lineEdit);
-
-
QVBoxLayout *leftLayout = new QVBoxLayout;
-
leftLayout->addLayout(topLeftLayout);
-
leftLayout->addWidget(caseCheckBox);
-
leftLayout->addWidget(backwordCheckBox);
-
-
QVBoxLayout *rightLayout = new QVBoxLayout;
-
rightLayout->addWidget(findButton);
-
rightLayout->addWidget(closeButton);
-
rightLayout->addStretch();//添加弹簧将上面的布局顶上去
-
-
QHBoxLayout *mainLayout = new QHBoxLayout;
-
mainLayout->addLayout(leftLayout);
-
mainLayout->addLayout(rightLayout);
-
setLayout(mainLayout);
-
-
setWindowTitle("Find");//设置对话框的标题
-
//setFixedHeight()是将对话框设置成固定的高度,其参数值sizeHint()返回“最理想”的大小,这里使用的是height()函数去到“最理想”的高度
-
setFixedHeight(sizeHint().height());
-
}
-
-
Dialog::~Dialog()
-
{
-
delete ui;
-
}
-
//findClicked()函数,首先取出lineEdit的输入值,然后判断caseCheckBox是不是选中
-
//如果选中,就返回Qt::CaseInsensitive,否则返回Qt::CaseSensitive,用于判断是不是
-
//大小写敏感的查找;最后如果backwardCheckBox被选中,就emit信号findPrevious(),否则
-
//emit信号findNext
-
void Dialog::findClicked()
-
{
-
QString text = lineEdit->text();
-
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive;
-
-
if (backwordCheckBox->isChecked()) {
-
emit findPrevious(text, cs);
-
} else {
-
emit findNext(text, cs);
-
}
-
}
-
//enableFindButton()则根据lineEdit的内容是不是变化来设置findButton是不是可以使用
-
void Dialog::enableFindButton(const QString &text)
-
{
-
findButton->setEnabled(!text.isEmpty());
-
}
-
//main.cpp
-
#include "dialog.h"
-
#include <QApplication>
-
-
int main(int argc, char *argv[])
-
{
-
QApplication a(argc, argv);
-
Dialog *dialog = new Dialog;
-
dialog->show();
-
-
return a.exec();
-
}
结果:
当没选中case&search两个复选框未选择时,FindButton就是不可用的灰色。。。
关于布局(layout)不是很了解,所以就先根据作者的直观的图解来理解,恩,果然很好看哇^_^ ...
阅读(12917) | 评论(0) | 转发(1) |