zoukankan      html  css  js  c++  java
  • QT学习第2天

    回顾:
    1.构建一个QT工程步骤
    (1)qmake -project
    (2)qmake
    (3)make
     
    2.两个常用的组件
    QLabel 标签
    QPushButton 按钮
     
    --------------------------------------
     
    四 容器窗口(父窗口)
    1.父窗口可以停靠其他组件,如果一个组件在创建时指定父窗口,那么就将停靠在父窗口上,如果不指定则飘在外面形成独立的窗体.
    2.常用的父窗口类
    QWidget ==>绝大多数图形相关组件都是它的子类
    QMainWindow(用的比较多,是QWidget的子类)
    QDialog(用的比较多,是QWidget的子类)
    3.QWidget的两个常用成员函数
    (1)调整大小
    resize(int x,int y); //参数是分辨率
    (2)移动位置
    move(int x,int y);
     
    五 信号和槽的其他用法
    1.一般情况信号和槽参数纯虚类型要相同
    eg:
    QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(int,string))); //ok
    QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(string,int))); //no
    2.可以带有缺省参数
    eg:
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int,string=“"))); //ok
    3.信号函数参数可以多于槽函数参数,多余的参数将被忽略
    eg:
    QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(int))); //ok
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int,string))); //no
    4.一个信号可以被连接到多个槽函数
    eg:
    QObject::connect(A,SIGNAL(sigFunc(int)),B1,SLOT(slotFunc(int))); //ok
    QObject::connect(A,SIGNAL(sigFunc(int)),B2,SLOT(slotFunc(int))); //ok
    注: 当A发送信号sigFunc,B1/B2的槽函数都会被执行,执行的顺序不确定
    5.多个信号可以连接到同一个槽函数
    QObject::connect(A1,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int))); //ok
    QObject::connect(A2,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int))); //ok
    注: 无论A1还是A2发出信号,B的槽函数都会被执行
     
    案例《事件同步》
    1.QSilder    滑块类
    QSlider(QWidget *parent = Q_NULLPTR)
    QSlider(Qt::Orientation orientation, QWidget *parent = Q_NULLPTR)
    Qt::Vertical 垂直的
    Qt::Horizontal 水平
     
    void setRange(int min,int max)[slots]; //设置滑动范围
    void setValue(int)[slots];    //设置当前值
    void valueChange(int value)[signal]; //值改变信号
    void setPageStep(int);//设置页步距
     
    2.QSpinBox 选值框类(微调框)
    QSpinBox(QWidget *parent = Q_NULLPTR);
    void setRange(int minimum, int maximum);//设置选值范围
    void setValue(int val)[slots];//设置当前值
    void valueChanged(int i)[signal];//值改变信号
     
    六 面向对象的QT编程
    1.基于对象的QT编程(不建议)
    2.面向对象的QT编程
    《案例》加法计算器
    class CalculateDialog:public QDialog{
    行为:
        构造函数:初始化界面 禁用等号按钮
    public slots:
        当输入左右操作数,发送信号,检查是否为有效数字,如果都是有效的,是能等号按钮
        当点击等号按钮,发送信号 计算结果并显示
    属性:
        QLineEdit QLabel QPushButton
    }
     案例代码如下:
    #ifndef        __CALCULATORDIALOG_H
    #define        __CALCULATORDIALOG_H
    
    #include <QDialog>
    #include <QLabel>
    #include <QPushButton>
    #include <QLineEdit>        //输入文本的组件
    #include <QDoubleValidator>    //双精度的校验器
    #include <QHBoxLayout>        //水平布局器
    
    class CalculatorDialog:public QDialog{
        //MOC编译器,把不符合标准的语法变成标准的C++语法
        Q_OBJECT
    public:
        CalculatorDialog(void);
    private:
        QLineEdit *m_editX;        //左操作数
        QLineEdit *m_editY;        //右操作数
        QPushButton *m_btnCalc;    //等号按钮
        QLineEdit *m_editZ;        //保存结果,只读属性
    private slots:
        void enableCalcButton(void);    //使能等号按钮
        void calcClicked(void);            //计算结果
    };
    
    #endif    //    __CALCULATORDIALOG_H
    CalculatorDialog.h
    #include "CalculatorDialog.h"
    
    //构造函数中初始化UI界面
    CalculatorDialog::CalculatorDialog(void){
        //设置对话框的标题 (继承过来的成员函数)
        setWindowTitle("加法计算器");
        
        m_editX = new QLineEdit(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->setReadOnly(true);                //设置只读
    
        m_btnCalc = new QPushButton("=",this);
        m_btnCalc->setEnabled(false);//设置禁用
    
        //使用水平布局器,自动调整每个组件的大小和位置
        QHBoxLayout *layout = new QHBoxLayout;
        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;
        //获取左右操作数的数据(QString),转换成浮点数
        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 str = QString::number(res,'g',15);
        //显示结果到m_editZ
        m_editZ->setText(str);
    }
    CalculatorDialog.cpp
    #include "CalculatorDialog.h"
    #include <QApplication>
    int main(int argc, char **argv){
        QApplication app(argc,argv);
        CalculatorDialog dialog;
        dialog.show();
        return app.exec();
    }
    Calculator.cpp
  • 相关阅读:
    将表中数据生成SQL语句
    遍历页面所有的控件
    MSN不能登陆
    刷新框架页
    JS传参出现乱码
    iframe攻击
    有关于VS调试Javascript的问题
    C#中StringBuilder类的使用
    前瞻XAML
    Asp.Net在SqlServer中的图片存取
  • 原文地址:https://www.cnblogs.com/niie9/p/6151057.html
Copyright © 2011-2022 走看看