Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1390578
  • 博文数量: 120
  • 博客积分: 182
  • 博客等级: 入伍新兵
  • 技术积分: 2278
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-19 16:31
文章分类

全部博文(120)

文章存档

2015年(12)

2014年(13)

2013年(40)

2012年(55)

分类: Windows平台

2013-10-13 23:17:39

     虽然学习Qt有段时间了,但是总是不得要领,真的是有些郁闷。。。无奈,没有捷径,只有多加练习和看书。最近在网上找到一篇<Qt学习之路(1-60)>感觉很不错。就开始看并且做练习,目前只能按部就班地练习现成的例子,学的很浅。。。。加油。。。记录学习过程,加油!坚持!恩,下面就附上练习的代码和结果(*^_^*):
    其实还是主要为了理解信号和槽机制,还有如何布局,恩。。 很重要的。。。要好好学……
下面是一个对话框的例子,学会了就可以自己变通和设计。。。。

点击(此处)折叠或打开

  1. //dialog.h
  2. #ifndef DIALOG_H
  3. #define DIALOG_H

  4. #include <QDialog>

  5. /*
  6.  *首先,声明四个用到的类。这里所做的是前向声明,否则就会编译出错,因为编译器不知道这些类是否存在
  7.  *为了slots的定义,需要访问Dialog的组件,因此就把其中的组件定义为成员变量以便访问。
  8.  *正是因为需要这些组件,才需要对它们的类型进行前向声明。因为我们仅仅使用的是指针,并不涉及到这些
  9.  *类的函数,因此并不需要include它们的头文件(当然也可以用引入头文件的方式,不过编译速度要慢些)
  10.  */
  11. class QCheckBox;
  12. class QLabel;
  13. class QLineEdit;
  14. class QPushButton;

  15. namespace Ui {
  16. class Dialog;
  17. }

  18. class Dialog : public QDialog
  19. {
  20.     Q_OBJECT

  21. public:
  22.     explicit Dialog(QWidget *parent = 0);
  23.     ~Dialog();

  24. signals:
  25.     //Qt::CaseSensitivity表示对带const QString &str字符串参数的输入的大小写要敏感
  26.     void findNext(const QString &str, Qt::CaseSensitivity cs);
  27.     void findPrevious(const QString &str, Qt::CaseSensitivity cs);

  28. private slots:
  29.     void findClicked();
  30.     void enableFindButton(const QString &text);

  31. private:
  32.     Ui::Dialog *ui;
  33.     QLabel *label;
  34.     QLineEdit *lineEdit;
  35.     QCheckBox *caseCheckBox;//QCheckBox类提供一个带有文本标签的复选框
  36.     QCheckBox *backwordCheckBox ;
  37.     QPushButton *findButton;
  38.     QPushButton *closeButton;
  39. };

  40. #endif // DIALOG_H

点击(此处)折叠或打开

  1. //dialog.cpp
  2. #include "dialog.h"
  3. #include "ui_dialog.h"
  4. #include <QtGui>

  5. Dialog::Dialog(QWidget *parent) :
  6.     QDialog(parent),
  7.     ui(new Ui::Dialog) //构造函数有参数初始化列表,用来调用父类的构造函数
  8. {
  9.     ui->setupUi(this);
  10.     label = new QLabel(tr("Find &what: "));//字符串中的&代表快捷键,该label的快捷键就是Alt+W
  11.     //不过这个label使用了setBuddy函数,意思是当label获得焦点时(如按下Alt+W)它的焦点会自动传给它的
  12.     //buddy,也就是lineEdit,这就是伙伴的意思。。。^_^
  13.     lineEdit = new QLineEdit;
  14.     label->setBuddy(lineEdit);

  15.     caseCheckBox = new QCheckBox(tr("Match &case"));
  16.     backwordCheckBox = new QCheckBox(tr("Search &backford"));

  17.     findButton = new QPushButton(tr("&Find"));//会生成Find字符串,当按下Alt+F时,就相当于findButton被点击了
  18.     findButton->setDefault(true);
  19.     findButton->setEnabled(false);//把findButton设为不可用

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

  21.     connect(lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&)));
  22.     connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
  23.     connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));


  24.     //后面这些都是layout的使用,编写layout布局最重要的一点就是思路清楚,想清楚哪个套路,就会比较好编写
  25.     QHBoxLayout *topLeftLayout = new QHBoxLayout;
  26.     topLeftLayout->addWidget(label);
  27.     topLeftLayout->addWidget(lineEdit);

  28.     QVBoxLayout *leftLayout = new QVBoxLayout;
  29.     leftLayout->addLayout(topLeftLayout);
  30.     leftLayout->addWidget(caseCheckBox);
  31.     leftLayout->addWidget(backwordCheckBox);

  32.     QVBoxLayout *rightLayout = new QVBoxLayout;
  33.     rightLayout->addWidget(findButton);
  34.     rightLayout->addWidget(closeButton);
  35.     rightLayout->addStretch();//添加弹簧将上面的布局顶上去


  36.     QHBoxLayout *mainLayout = new QHBoxLayout;
  37.     mainLayout->addLayout(leftLayout);
  38.     mainLayout->addLayout(rightLayout);
  39.     setLayout(mainLayout);

  40.     setWindowTitle("Find");//设置对话框的标题
  41.     //setFixedHeight()是将对话框设置成固定的高度,其参数值sizeHint()返回“最理想”的大小,这里使用的是height()函数去到“最理想”的高度
  42.     setFixedHeight(sizeHint().height());
  43. }

  44. Dialog::~Dialog()
  45. {
  46.     delete ui;
  47. }
  48. //findClicked()函数,首先取出lineEdit的输入值,然后判断caseCheckBox是不是选中
  49. //如果选中,就返回Qt::CaseInsensitive,否则返回Qt::CaseSensitive,用于判断是不是
  50. //大小写敏感的查找;最后如果backwardCheckBox被选中,就emit信号findPrevious(),否则
  51. //emit信号findNext
  52. void Dialog::findClicked()
  53. {
  54.     QString text = lineEdit->text();
  55.     Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive;

  56.     if (backwordCheckBox->isChecked()) {
  57.         emit findPrevious(text, cs);
  58.     } else {
  59.         emit findNext(text, cs);
  60.     }
  61. }
  62. //enableFindButton()则根据lineEdit的内容是不是变化来设置findButton是不是可以使用
  63. void Dialog::enableFindButton(const QString &text)
  64. {
  65.     findButton->setEnabled(!text.isEmpty());
  66. }

点击(此处)折叠或打开

  1. //main.cpp
  2. #include "dialog.h"
  3. #include <QApplication>

  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication a(argc, argv);
  7.     Dialog *dialog = new Dialog;
  8.     dialog->show();

  9.     return a.exec();
  10. }
结果:

当没选中case&search两个复选框未选择时,FindButton就是不可用的灰色。。。
关于布局(layout)不是很了解,所以就先根据作者的直观的图解来理解,恩,果然很好看哇^_^  ...

阅读(12799) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~