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

    回顾:
    布局:
    绝对位置法:
    手工布局:QLayout
    可视化布局:设计器
    VB MFC JAVA C# cocos

    QT信号和槽

    ----------------------------------
    1.信号与槽 Signals & Slots
    信号和槽是一种高级接口(函数),是QT自定义的一种通信机制,独立于标准C++
    应用于对象之间的通信,是QT的核心特性,也是QT区别于其它工具包的重要地方。

    所有的QObject或其子类(如QWidget)派生的类都包含信号和槽。

    Q_OBJECT//这是一个宏 如果需要进行对象之间的通信,必须有这个宏的支持。

    信号:当对象改变其状态时,信号就由该对象发射(emit)出去。
    当一个信号被发射时,与其有关联的槽将立刻被执行,就像函数调用一样。

    槽:槽函数。是普通的C++成员函数,可以被正常调用,和普通成员函数唯一的区别就是可以和信号连接
    也有访问权限。


    信号和槽关联:
    connect(
    //信号发出者,信号,信号接收者,槽函数
    sender,SIGNAL(signal),receiver,SLOT(slot)
    )
    connect(button,SIGNAL(clicked()),this,SLOT(close()));


    每个QT对象都包含预定的信号和槽。

    自定义信号和槽:
    自定义的槽:
    public slots:
    //槽函数声明
    自定义信号:
    signals:
    //信号声明(信号只需要声明,不需要实现)

    发射信号:emit 信号;

    注:
    1.槽不能与槽相联
    2.信号与槽的参数要一致(类型,个数,顺序),信号的参数可以比槽的参数多,不能少。
    3.信号与槽的参数只需要写类型就可以了,不需要写形参。


    案例:初步实现登录功能(即用户名和密码已经确定)

    ----------------------
    2.QString类:
    QString类提供了多个函数来操作字符串
    编辑操作:
    append()/prepend()
    replace()
    insert()
    remove()
    isEmpty()

    查询操作:
    right(),left(),mid(),indexOf()
    at(),contains(),count(),startWidth(),endWith()
    > < ...
    转换操作:
    toInt(),toDouble()
    number()//静态函数
    toLower()/toUpper()
    arg()//
    QString -> char *
    //toUtf8().data()


    cal

    代码1;

    main.cpp

    #include "widget.h"
    #include <QApplication>

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
    }

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QWidget>

    namespace Ui {
    class Widget;
    }

    class Widget : public QWidget
    {
    Q_OBJECT

    public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    public slots://自定义槽函数
    void mySlots(bool);
    void emitSignalSlot();

    signals:
    void mySignal();

    private:
    Ui::Widget *ui;
    };

    #endif // WIDGET_H

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    //QPushButton *btn = new QPushButton;
    ui->pushButton->setText("关闭");
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(close()));
    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),
    ui->dial,SLOT(setValue(int)));

    ui->horizontalSlider->setMaximum(200);
    ui->dial->setMaximum(200);


    connect(ui->btn,SIGNAL(clicked(bool)),this,SLOT(mySlots(bool)));
    // connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(emitSignalSlot()));
    // connect(this,SIGNAL(mySignal()),this,SLOT(close()));
    }

    Widget::~Widget()
    {
    delete ui;
    }

    void Widget::mySlots(bool ok)//自定义的槽函数
    {

    ui->btn->setCheckable(true);//设置按钮可选
    bool ok1 = ui->btn->isCheckable();//获取按钮是否可选定
    //qDebug() << ok1;
    if(ok)
    {
    ui->btn->setText("打开");
    }
    else
    {
    ui->btn->setText("关闭");
    }

    }

    void Widget::emitSignalSlot()//发射信号的槽函数
    {
    qDebug("emitSignalslot()");
    emit mySignal();
    }

    代码2

    main.cpp

    #include "widget.h"
    #include <QApplication>
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
       // w.show();
    
    
        return a.exec();
    }


    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QWidget>

    namespace Ui {
    class Widget;
    }

    class Widget : public QWidget
    {
    Q_OBJECT

    public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    private:
    Ui::Widget *ui;
    };

    #endif // WIDGET_H

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    QString str = "hello qt";
    str.append("7-20");//追加
    str.replace("qt","c++");//替换
    str.insert(2,"A");//插入,下标从0开始
    //remove
    bool ok = str.isEmpty();//判断字符串是否为空

    //qDebug() << str;//str = heAllo c++7-20
    //------------------------------
    //qDebug() << str.right(3);//str的右边3个字符
    //qDebug() << str.mid(5,3);//从第5个位置取3个字符
    //qDebug() << str.indexOf("++");//获得指定字符串在str中出现的索引位置
    //qDebug() << str.at(0);//取第i个位置的值
    //qDebug() << str.contains("20");//查询str中是否包含指定的字符串
    //qDebug() << str.contains("30");
    //qDebug() <<str.count("l");//指定字符串出现的次数
    //qDebug() << str.startsWith("h");
    //-----------------------------------
    QString s = "123.45";
    int a;
    //a = s.toInt();//把字符串转为整数
    double d = s.toDouble();//转为双精度数
    qDebug() << s;
    qDebug() << d;
    QString sd =
    QString::number(d);//把数字转为字符串
    qDebug() << sd;
    //用户名为XXX 密码为XXX
    QString name = "zhangfei";
    QString pwd = "123";
    str = QString("用户名为%1 密码为%2").arg(name).arg(pwd);
    qDebug() << str;

    char *p = "hello";
    QString ss = "world";
    // ss.toStdString().data();//把QString转换为char*
    // ss.toUtf8().data();
    // ss.toLatin1().data();
    // ss.toLocal8Bit().data();

    }

    Widget::~Widget()
    {
    delete ui;
    }

    代码三

    main.cpp

    #include "widget.h"
    #include <QApplication>
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
    
        return a.exec();
    }


    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QWidget>

    namespace Ui {
    class Widget;
    }

    class Widget : public QWidget
    {
    Q_OBJECT

    public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    public slots:
    void calcSlot();

    private slots:
    void on_pushButton_clicked();

    private:
    Ui::Widget *ui;
    };

    #endif // WIDGET_H

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"

    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    ui->lineEdit_3->setReadOnly(true);//设置文本框为只读
    // connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(calcSlot()));
    }

    Widget::~Widget()
    {
    delete ui;
    }

    void Widget::calcSlot()//slot
    {
    //1.获取两个加数
    int n1 = ui->lineEdit->text().toInt();
    int n2 = ui->lineEdit_2->text().toInt();
    //2.两数相加
    int res = n1 + n2;
    //3.把结果显示出来
    ui->lineEdit_3->setText(QString::number(res));
    }


    void Widget::on_pushButton_clicked()
    {
    calcSlot();
    }

    代码四

    main.cpp

    #include "widget.h"
    #include <QApplication>

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
    }

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QWidget>
    #include "mainform.h"
    namespace Ui {
    class Widget;
    }

    class Widget : public QWidget
    {
    Q_OBJECT

    public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    public slots:
    void loginSlot();

    private:
    Ui::Widget *ui;
    mainForm *mf;
    };

    #endif // WIDGET_H

    mainform.h

    #ifndef MAINFORM_H
    #define MAINFORM_H
    
    
    #include <QWidget>
    
    
    namespace Ui {
    class mainForm;
    }
    
    
    class mainForm : public QWidget
    {
        Q_OBJECT
    
    
    public:
        explicit mainForm(QWidget *parent = 0);
        ~mainForm();
    
    
    private:
        Ui::mainForm *ui;
    };
    
    
    #endif // MAINFORM_H



    mainfrom.cpp

    #include "mainform.h"
    #include "ui_mainform.h"

    mainForm::mainForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mainForm)
    {
    ui->setupUi(this);
    }

    mainForm::~mainForm()
    {
    delete ui;
    }

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(loginSlot()));
    mf = new mainForm;
    }

    void Widget::loginSlot()
    {
    //获取用户输入的用户名和密码
    QString name = ui->lineEdit->text();
    QString pwd = ui->lineEdit_2->text();
    qDebug() << name;
    qDebug() << pwd;
    //2.判断用户名和密码是否正确
    if(name == "zhangfei" && pwd == "123")
    {
    qDebug() << "登录成功!";

    //1.把自己关闭或隐藏
    //this->close();
    this->hide();
    //2.显示主窗体(登录成功后显示的窗体)
    mf->show();
    }
    else
    {
    qDebug() << "用户名或密码错误";
    }
    }

    Widget::~Widget()
    {
    delete ui;
    }

  • 相关阅读:
    hdu1251 && hud 1247 (字典树)
    linux系统调用kernel code
    Android init.rc 服务启动不成功
    android init执行service的脚本code位置
    printk %pS %pF含义
    进程页表图示
    linux内核之进程的基本概念(进程,进程组,会话关系)
    What is the purpose of the controlling terminal?
    android init.rc中service console option的含义、作用
    启动和停止init.rc中的服务
  • 原文地址:https://www.cnblogs.com/liudehao/p/5702302.html
Copyright © 2011-2022 走看看