QT:面向对象的Qt编程

来源:互联网 发布:评定nba历史地位的算法 编辑:程序博客网 时间:2024/05/22 09:47

面向对象的QT编程

1. 基于对象的QT编程        // QT的功能受到限制,不推荐
2. 面向对象的QT编程
《案例》 加法计算器
class CalculateDialog : public QDialog {
// 行为:
    构造函数 ( ) { 初始化界面 }
    槽函数:当输入左右操作数时,发送信号,检测是否都为有效数字,使能等号按钮;
    槽函数:当点击等号按钮时,发送信号,计算结果并显示;
// 属性:
    QLineEdit
    QLabel
    QPushButton
};
int main (int argc, char** argv) {
    QApplication app (argc, argv);
    CalculateDialog dialog;
    dialog.show ();
    return app.exec ();
}

QLineEdit输入组件
    QLineEdit(QWidget * parent = 0);
    QLineEdit(const QString & contents, QWidget * parent = 0);
    QString    text() const;  // 获取输入内容
    void    setText(const QString &) [slots];  // 设置输入内容
    double QString::toDouble(bool * ok = 0) const;  // 转换字符为数字
    void    textChanged(const QString & text) [signals];  //  输入改变检测

<tips>
"拷贝QT工程项目文件夹到虚拟机和windows系统共享文件夹,命令:"
$:cp ../Calculator/ /mnt/hgfs/QT/ -frd
//  工程目录 Calculator

/** 代码演示 - 加法计算器 **/ // CalculatorDialog.h#ifndef _CALCULATORDIALOG_H#define _CALCULATORDIALOG_H#include <QDialog>#include <QLineEdit>#include <QPushButton>#include <QLabel>#include <QDoubleValidator>  // 验证器#include <QHBoxLayout>  // 水平布局器class CalculatorDialog : public QDialog {    Q_OBJECT  // moc编译器,将不符合c++标准的变成规范的语法public:    CalculatorDialog (void); // 缺省表现为父窗口public slots: // 编译依赖 Q_OBJECT    // 使能等号按钮    void enableCalcButton (void);    // 计算结果    void calcClicked (void);private:    QLineEdit* m_editX; // 左操作数    QLineEdit* m_editY; // 右操作数    QLineEdit* m_editZ; // 显示结果QPushButton* m_btnCalc; // 等号按钮QPushButton* m_c; // 重置按钮};#endif //_CALCULATORDIALOG_H// CalculatorDialog.cpp#include "CalculatorDialog.h"// 构造函数,初始化UICalculatorDialog::CalculatorDialog (void) {    // 设置窗口标题    setWindowTitle ("加法计算器");    // 计算器左操作数    m_editX = new QLineEdit (this); // this 指向父窗口    // 设置文本对齐方式 - 右对齐    m_editX->setAlignment (Qt::AlignRight);    // 设置双精度验证器,是一个隐藏部件,限制只能输入数字    m_editX->setValidator (new QDoubleValidator (this));    // 计算器右操作数    m_editY = new QLineEdit (this);    m_editY->setAlignment (Qt::AlignRight);    m_editY->setValidator (new QDoubleValidator (this));        // 计算器结果    m_editZ = new QLineEdit (this);    m_editZ->setAlignment (Qt::AlignRight);    m_editZ->setValidator (new QDoubleValidator (this));    m_editZ->setReadOnly (true); // 设置只读    m_btnCalc = new QPushButton ("=", this);    m_btnCalc->setEnabled (false); // 禁用按钮(灰色)    // 布局器:可以根据容器窗口,自动调整每个组件的大小和位置    // 创建水平布局器    QHBoxLayout* layout = new QHBoxLayout (this);    // 将每个组件按从左到右的顺序添加到布局器中    layout->addWidget (m_editX);    layout->addWidget (new QLabel ("+"));    layout->addWidget (m_editY);    layout->addWidget (m_btnCalc);    layout->addWidget (m_editZ);    // 设置布局器    setLayout (layout);    // 当输入左右操作数时,发送信号    connect (m_editX, SIGNAL (textChanged (const QString&)),            this, SLOT (enableCalcButton ()));    connect (m_editY, SIGNAL (textChanged (const QString&)),            this, SLOT (enableCalcButton ()));    // 点击等号按钮,发送信号,计算结果    connect (m_btnCalc, SIGNAL (clicked ()),            this, SLOT (calcClicked ()));}// 槽函数:使能等号void CalculatorDialog::enableCalcButton (void) {    bool bXOk;    bool bYOk;    // 获取输入数据,转换成double,结果保存到参数中    // 如果成功参数值为true,否则为false    m_editX->text ().toDouble (&bXOk);    m_editY->text ().toDouble (&bYOk);    if (bXOk && bYOk) {        m_btnCalc->setEnabled (true); // 使能等号按钮    } else {        m_btnCalc->setEnabled (false);    }}// 槽函数:计算结果void CalculatorDialog::calcClicked (void) {    double res = m_editX->text ().toDouble () +                 m_editY->text ().toDouble ();    // QString::number 将数字转换为QString字符串,g紧凑格式,15精度    QString str = QString::number (res, 'g', 15);     // 显示结果    m_editZ->setText (str);}// main.cpp#include <QApplication>#include "CalculatorDialog.h"int main (int argc, char** argv) {    // 一般情况下很大的一个QT项目也是这四句话--参考    QApplication app (argc, argv);    CalculatorDialog dialog;    dialog.show ();    return app.exec ();}


/** 代码练习 - 以下是增加了 C 重置button **/ #include "CalculatorDialog.h"CalculatorDialog::CalculatorDialog (void) {    setWindowTitle ("加法计算器 - By Jan  2017.01.17");    // 创建出输入组件    m_l = new QLineEdit (this);    m_r = new QLineEdit (this);    m_sum = new QLineEdit (this);    // 输入组件内文本靠右对齐    m_l->setAlignment (Qt::AlignRight);    m_r->setAlignment (Qt::AlignRight);    m_sum->setAlignment (Qt::AlignRight);    // 验证输入    m_l->setValidator (new QDoubleValidator (this));    m_r->setValidator (new QDoubleValidator (this));    m_sum->setReadOnly (true);    // c button    m_c = new QPushButton ("C", this);    // = button    m_button = new QPushButton ("=", this);    m_button->setEnabled (false);    // 水平布局器    QHBoxLayout* layout = new QHBoxLayout (this);    layout->addWidget (m_c);    layout->addWidget (m_l);    layout->addWidget (new QLabel ("+"));    layout->addWidget (m_r);    layout->addWidget (m_button);    layout->addWidget (m_sum);    setLayout (layout);    // 信号与槽函数连接 c    connect (m_c, SIGNAL (clicked ()),            this->m_l, SLOT (clear ()));     connect (m_c, SIGNAL (clicked ()),            this->m_r, SLOT (clear ()));    connect (m_c, SIGNAL (clicked ()),            this->m_sum, SLOT (clear ()));    // 信号与槽函数连接 输入框    connect (m_l, SIGNAL (textChanged (const QString&)),            this, SLOT (enableCalcButton ()));    connect (m_r, SIGNAL (textChanged (const QString&)),            this, SLOT (enableCalcButton ()));    // 信号与槽函数连接 =    connect (m_button, SIGNAL (clicked ()),            this, SLOT (calcClicked ()));}void CalculatorDialog::enableCalcButton (void) {    bool bx;    bool by;    m_l->text ().toDouble (&bx);    m_r->text ().toDouble (&by);    if (bx && by)        m_button->setEnabled (true);    else        m_button->setEnabled (false);}void CalculatorDialog::calcClicked (void) {    double res = m_l->text ().toDouble () +                 m_r->text ().toDouble ();    QString str = QString::number (res, 'g', 15);    m_sum->setText (str);}

0 0