Qt学习笔记[1]

1. QtCreator常用快捷键

  1. Ctrl + R 运行
  2. Ctrl + B 编译
  3. Ctrl + F 查找
  4. F1 帮助文档
  5. ctrl+滚轮 自体缩放
  6. ctrl+i 自动对齐
  7. ctrl+shift+方向键 整行移动
  8. F4 同名之间.h与.cpp之间切换
  9. ctrl+/ 注释的快捷键

2. 基本结构解析

  • pro文件
  1. TARGET 生成exe程序名称
  2. TEMPLATE app 应用程序模板
  3. SOURCE HEADER 源文件以及头文件
  4. QT += 模块名   wdiget模块要4.0以上
  • main函数
  1. ctrl->setParent(x) 设置x为ctrl控件的父对象
  2. ctrl->setText("aaa") 为ctrl控件文本设置为"aaa"
  3. ctrl->move(x, y) 把ctrl移动到(x, y)位置
  4. ctrl.resize(...) 重置控件大小
  5. setWindowTitle("xxx") 设置窗口标题
  6. ctr.setFixedSize(...) 固定控件大小
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(500, 300);
    QPushButton *btn = new QPushButton;
    btn->setParent(this);
    btn->setText(QString("确定"));
    btn->move(100, 100);
    btn->resize(70, 30);
    // this->setFixedSize(600, 400);
    setWindowTitle(QString("Qt的第一个窗口"));

    MyButton *myBtn = new MyButton;
    myBtn->setParent(this);
    myBtn->move(200, 100);
    myBtn->setText("取消");
    myBtn->resize(70, 30);

    connect(myBtn, &QPushButton::clicked, this,  &QWidget::close);
}

3. 信号与槽机制

connect(信号的发送者,信号,信号的接受者,槽函数)

connect(btn, &QPushButton::clicked, this, &QWidget::close)

1. 自定义信号

  • 返回void
  • 需要声明不需要实现
  • 可以有参数

2. 自定义槽函数

  • 返回值void
  • 需要声明实现
  • 可以有参数

3. 信号触发槽函数方式

emit obj->signal(); // obj为拥有signal信号的对象, signal可以为任意名称

注意: 当自定义信号和槽出现重载时, 原先写法失效,因为执行的函数地址不明确

解决方法是: 利用函数指针来明确指明特定函数地址

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pTeacher = new Teacher(this);
    pStudent = new Student(this);


    void (Teacher:: *teacher_signal)(QString) = &Teacher::hungry;
    void (Student:: *student_slot)(QString) = &Student::treat;
    connect(pTeacher, teacher_signal, pStudent, student_slot);
   //  connect(pTeacher, &Teacher::hungry, pStudent, &Student::treat);

}
  1. str.toUtf8() QString转QByteArray
  2. str.data() QByteArray转char *方法

如果直接输出QString会出现字符串有双引号括起来的现象,可以通过str.toUtf8().data()来转换

4. 信号与槽的拓展

  1. 信号可以连接信号
  2. 一个信号可以触发多个槽函数,一个槽函数也可以接收多个信号
  3. 信号可以与槽断开
  4. 信号形参与槽形参类型必须一一对应,但信号形参的数量可以比槽多
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pTeacher = new Teacher(this);
    pStudent = new Student(this);


//    void (Teacher:: *teacher_signal)(QString) = &Teacher::hungry;
//    void (Student:: *student_slot)(QString) = &Student::treat;
//    connect(pTeacher, teacher_signal, pStudent, student_slot);

   //  connect(pTeacher, &Teacher::hungry, pStudent, &Student::treat);
    QPushButton *btn = new QPushButton("下课", this);

    // 信号连接信号
    void (Teacher::*t_has_param)() = &Teacher::hungry;
    void (Student::*s_has_param)() = &Student::treat;
    connect(btn, &QPushButton::clicked, pTeacher, t_has_param);
    connect(pTeacher, t_has_param, pStudent, s_has_param);
    this->resize(400, 200);
    // 一个信号触发多个槽函数,这里btn触发了两次treat槽
    connect(btn, &QPushButton::clicked, pStudent, s_has_param);
    // 信号可以与槽函数断开, 多个信号也可以连接同一个槽函数
    disconnect(btn, &QPushButton::clicked, pStudent, s_has_param);
    // 信号的形参和槽函数的形参类型必须一一对应, 数量可以不一一对应, 信号形参数目可以多于槽函数

}

Qt4版本的信号与槽的写法:

//Qt4版本connect写法
connect(pTeacher, SIGNAL(hungry(QString)), pStudent, SLOT(treat(QString)));
  • 优点: 参数直观, 不用写函数指针
  • 缺点: 不会做类型检查,即上面第四点
  • 结论: 不推荐使用!!

(完)

你可能感兴趣的:(MFC\Qt,qt5)