菜鸟学QT之四-------------第一个对话框 .

一、

新建一个工程,选择QT Application,工程名qtFindDlg;注意,BaseDialog选择QDialog,而不是默认的QMainWindow;点击“完成”。

程序完成运行效果如图:

 

上代码finddlg.h:

view plain copy to clipboard print ?
  1. #ifndef FINDDLG_H   
  2. #define FINDDLG_H   
  3.   
  4. #include <QtGui/QDialog>   
  5. #include "ui_finddlg.h"   
  6. class QCheckBox;  
  7. class QLabel;  
  8. class QLineEdit;  
  9. class QPushButton;  
  10.   
  11. class FindDlg : public QDialog  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     FindDlg(QWidget *parent = 0, Qt::WFlags flags = 0);  
  17.     ~FindDlg();  
  18. signals:  
  19.     void findNext(const QString& str, Qt::CaseSensitivity cs);  
  20.     void findPrevious(const QString& str, Qt::CaseSensitivity cs);  
  21.   
  22.     private slots:  
  23.         void findClicked();  
  24.         void enableFindButton(const QString& text);  
  25. private:  
  26.     Ui::FindDlgClass ui;  
  27.     QLabel* m_pQLabel;  
  28.     QLineEdit* m_pQLineEdit;  
  29.     QCheckBox* m_pQCaseCheckBox;  
  30.     QCheckBox* m_pQBackwardCheckBox;  
  31.     QPushButton* m_pQFindButton;  
  32.     QPushButton* m_pQCloseButton;  
  33. };  
  34.   
  35. #endif // FINDDLG_H  

#ifndef FINDDLG_H #define FINDDLG_H #include <QtGui/QDialog> #include "ui_finddlg.h" class QCheckBox; class QLabel; class QLineEdit; class QPushButton; class FindDlg : public QDialog { Q_OBJECT public: FindDlg(QWidget *parent = 0, Qt::WFlags flags = 0); ~FindDlg(); signals: 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::FindDlgClass ui; QLabel* m_pQLabel; QLineEdit* m_pQLineEdit; QCheckBox* m_pQCaseCheckBox; QCheckBox* m_pQBackwardCheckBox; QPushButton* m_pQFindButton; QPushButton* m_pQCloseButton; }; #endif // FINDDLG_H


 

对于所有定义了信号和槽的类,在类定义开始处的Q_OBJECT宏都是必需的。

Signals部分声明了当用户单击Find按钮时对话框所发射的信号。

Signals关键字实际上是一个宏。C++预处理器会在编译程序找到它之前把它转换成标准C++代码。

之后private slots:声明了两个槽。为了实现这两个槽,几乎需要访问这个对话框的所有子窗口部件(控件),所以也就保留了指向这些子窗口部件的指针。关键字slots如同signals一样也是一个宏。

 

下面是finddlg.cpp的代码

view plain copy to clipboard print ?
  1. #include <QtGui>   
  2. #include "finddlg.h"   
  3. #include <iostream>   
  4. #include <exception>   
  5.   
  6. FindDlg::FindDlg(QWidget *parent, Qt::WFlags flags)  
  7.     : QDialog(parent, flags)  
  8. {  
  9.     ui.setupUi(this);  
  10.     try  
  11.     {  
  12.         m_pQLabel = new QLabel(tr("Find &what:"));   
  13.         m_pQLineEdit = new QLineEdit;  
  14.         m_pQLabel->setBuddy(m_pQLineEdit);   
  15.   
  16.         m_pQCaseCheckBox = new QCheckBox(tr("Match &case"));   
  17.         m_pQBackwardCheckBox = new QCheckBox(tr("Search &backford"));   
  18.   
  19.         m_pQFindButton = new QPushButton(tr("&Find"));   
  20.         m_pQFindButton->setDefault(true);   
  21.         m_pQFindButton->setEnabled(false);   
  22.   
  23.         m_pQCloseButton = new QPushButton(tr("Cl&ose"));   
  24.   
  25.         connect(m_pQLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&)));   
  26.         connect(m_pQFindButton, SIGNAL(clicked()), this, SLOT(findClicked()));   
  27.         connect(m_pQCloseButton, SIGNAL(clicked()), this, SLOT(close()));   
  28.   
  29.         QHBoxLayout *topLeftLayout = new QHBoxLayout;   
  30.         topLeftLayout->addWidget(m_pQLabel);   
  31.         topLeftLayout->addWidget(m_pQLineEdit);   
  32.   
  33.         QVBoxLayout *leftLayout = new QVBoxLayout;   
  34.         leftLayout->addLayout(topLeftLayout);   
  35.         leftLayout->addWidget(m_pQCaseCheckBox);   
  36.         leftLayout->addWidget(m_pQBackwardCheckBox);   
  37.   
  38.         QVBoxLayout *rightLayout = new QVBoxLayout;   
  39.         rightLayout->addWidget(m_pQFindButton);   
  40.         rightLayout->addWidget(m_pQCloseButton);   
  41.         rightLayout->addStretch();   
  42.   
  43.         QHBoxLayout *mainLayout = new QHBoxLayout;   
  44.         mainLayout->addLayout(leftLayout);   
  45.         mainLayout->addLayout(rightLayout);   
  46.         setLayout(mainLayout);   
  47.   
  48.         setWindowTitle(tr("Find"));   
  49.         setFixedHeight(sizeHint().height());   
  50.     }  
  51.     catch(std::bad_alloc& e)  
  52.     {  
  53.         std::cerr << e.what() << std::endl;  
  54.     }  
  55.     catch(...)  
  56.     {  
  57.         std::cerr << "err" << std::endl;  
  58.     }  
  59. }  
  60.   
  61. FindDlg::~FindDlg()  
  62. {  
  63.     if (NULL != m_pQLabel)  
  64.     {  
  65.         delete m_pQLabel;  
  66.     }  
  67.     if (NULL != m_pQLineEdit)  
  68.     {  
  69.         delete m_pQLineEdit;  
  70.     }  
  71.     if (NULL != m_pQCaseCheckBox)  
  72.     {  
  73.         delete m_pQCaseCheckBox;  
  74.     }  
  75.     if (NULL != m_pQBackwardCheckBox)  
  76.     {  
  77.         delete m_pQBackwardCheckBox;  
  78.     }  
  79.     if (NULL != m_pQFindButton)  
  80.     {  
  81.         delete m_pQFindButton;  
  82.     }  
  83.     if (NULL != m_pQCloseButton)  
  84.     {  
  85.         delete m_pQCloseButton;  
  86.     }  
  87. }  
  88. void FindDlg::findClicked()  
  89. {  
  90.       
  91.     QString text = m_pQLineEdit->text();  
  92.     Qt::CaseSensitivity cs = m_pQCaseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseInsensitive;  
  93.     if (m_pQBackwardCheckBox->isChecked())  
  94.     {  
  95.         emit findPrevious(text, cs);  
  96.     }  
  97.     else  
  98.     {  
  99.         emit findNext(text, cs);  
  100.     }  
  101.     return;  
  102. }  
  103.   
  104. void FindDlg::enableFindButton(const QString& text)  
  105. {  
  106.     m_pQFindButton->setEnabled(!text.isEmpty());  
  107.     return;  
  108. }  

#include <QtGui> #include "finddlg.h" #include <iostream> #include <exception> FindDlg::FindDlg(QWidget *parent, Qt::WFlags flags) : QDialog(parent, flags) { ui.setupUi(this); try { m_pQLabel = new QLabel(tr("Find &what:")); m_pQLineEdit = new QLineEdit; m_pQLabel->setBuddy(m_pQLineEdit); m_pQCaseCheckBox = new QCheckBox(tr("Match &case")); m_pQBackwardCheckBox = new QCheckBox(tr("Search &backford")); m_pQFindButton = new QPushButton(tr("&Find")); m_pQFindButton->setDefault(true); m_pQFindButton->setEnabled(false); m_pQCloseButton = new QPushButton(tr("Cl&ose")); connect(m_pQLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&))); connect(m_pQFindButton, SIGNAL(clicked()), this, SLOT(findClicked())); connect(m_pQCloseButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *topLeftLayout = new QHBoxLayout; topLeftLayout->addWidget(m_pQLabel); topLeftLayout->addWidget(m_pQLineEdit); QVBoxLayout *leftLayout = new QVBoxLayout; leftLayout->addLayout(topLeftLayout); leftLayout->addWidget(m_pQCaseCheckBox); leftLayout->addWidget(m_pQBackwardCheckBox); QVBoxLayout *rightLayout = new QVBoxLayout; rightLayout->addWidget(m_pQFindButton); rightLayout->addWidget(m_pQCloseButton); rightLayout->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout); setWindowTitle(tr("Find")); setFixedHeight(sizeHint().height()); } catch(std::bad_alloc& e) { std::cerr << e.what() << std::endl; } catch(...) { std::cerr << "err" << std::endl; } } FindDlg::~FindDlg() { if (NULL != m_pQLabel) { delete m_pQLabel; } if (NULL != m_pQLineEdit) { delete m_pQLineEdit; } if (NULL != m_pQCaseCheckBox) { delete m_pQCaseCheckBox; } if (NULL != m_pQBackwardCheckBox) { delete m_pQBackwardCheckBox; } if (NULL != m_pQFindButton) { delete m_pQFindButton; } if (NULL != m_pQCloseButton) { delete m_pQCloseButton; } } void FindDlg::findClicked() { QString text = m_pQLineEdit->text(); Qt::CaseSensitivity cs = m_pQCaseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseInsensitive; if (m_pQBackwardCheckBox->isChecked()) { emit findPrevious(text, cs); } else { emit findNext(text, cs); } return; } void FindDlg::enableFindButton(const QString& text) { m_pQFindButton->setEnabled(!text.isEmpty()); return; }

 

代码第X行,“12”符号来表示快捷键,可以用来控制焦点。而在第14行设置了行编辑器作为标签的伙伴。所谓伙伴“buddy”,就是一个窗口部件,它可以在按下标签的快捷键时接收焦点。

通过setDefault(true)让Find按钮成为对话框的默认按钮。意为当用户按下Enter键时如同鼠标点击了“Find”按钮。

当用户单击Find按钮时,就会调用findClicked()槽。而该槽将会发射findPrevious()或findNext()信号。emit是Qt中的关键字,像其他QT扩展一样它也会被C++预处理器转换成标准的C++代码。

由于在创建这个对话框中的窗口部件和而已时使用的是new,所以需要写一个能调用delete的析构函数,以便可以删除所创建的每一个窗口部件和布局。但是这样做并不是必需的,因为QT会在删除父对象的时候自动删除其所属的子对象,也就会删除FindDialog中作为期子孙的所有子窗口部件和子布局。但是个人还是比较喜欢自己控制的东西。

你可能感兴趣的:(职场,对话框,休闲,QT开发)