[TOC]

0. 安装与部属开发环境

开发环境为Win10x64, Qt5.1.1, MINGW:GCC/G++ 6.3.0

0. QT相关库

官网下载QT5.1.1 with MINGW

1. 编译器

MINGW

2. IDE

notepad++

1. 快速上手

0. 计算器

0. 源文件

calculator

1. 操作界面

操作界面

2.重点注意

  1. SIGNAL(emitted_func)为信号函数, SLOT(received_func)为槽函数,可以理解为接收到函数为emitted_func的SIGNAL信号之后,触发函数received_func的SLOT函数,用法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    /********************************************
    Args:
    sender, `QWidget *`: 类型为QWidget'的子类指针,由该对象发出信号
    SINGNAL(emitted_func), `****`: 将函数放置在SIGNAL中, 若为自己定义的信号函数,需要在代码中emit某个信号并在此函数中捕获
    receiver, `QWidget`: 类型为QWidget的子类指针,由该对象接受信号
    SLOT(received_func), `****`: 将函数放置在SLOT中,作为触发的槽函数,若需要触发某个信号,也可以是SINGAL(received_func)
    ********************************************/
    connect(sender, SIGNAL(emitted_func), receiver, SLOT(received_func));
  2. 上述绑定信号与触发函数为无参形式,若有参数可以使用类型为QSignalMapper,将空间widget与该signalmapper绑定,并为每个控件设置相应的信号映射,最后由singalmapper绑定所对应的槽函数,用法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /*******************************************
    用法与上述无参类似,知识多了一步控件与信号之间的映射,
    参数的类型可为 `int`, `QString`, `QObject`等
    *******************************************/
    for(int i = 0; i < 10; ++i) {
    this->ptr_buttons_.push_back(
    new QPushButton(QString::number(i)));
    }
    this->ptr_signal_mapper_ = new QSignalMapper(this);
    for(int i = 0; i < this->ptr_buttons_.size(); ++i) {
    connect(this->ptr_buttons_[i], SIGNAL(clicked()),
    this->ptr_signal_mapper_, SLOT(map()));
    this->ptr_signal_mapper_->setMapping(this->ptr_buttons_[i], i);
    }
    connect(this->ptr_signal_mapper_, SIGNAL(mapped(int)),
    this, SLOT(on_button_clicked(int)));
  3. 触发函数在SLOT绑定的时候不能用this->func的形式进行绑定,而是要用func的形式绑定,具体原因暂时未知,具体用法如下:

    1
    2
    3
    4
    5
    6
    7
    /*
    on_button_clicked是类成员函数,用connect时不能用this->
    */
    connect(this->ptr_signal_mapper_, SIGNAL(mapped(int)),
    this, SLOT(on_button_clicked(int))); // VALID
    connect(this->ptr_signal_mapper_, SIGNAL(mapped(int)),
    this, SLOT(this->on_button_clicked(int))); // INVALID
  4. 头文件中包含Q_OBJECT名的头文件需要事先将其用moc转换成对应的moc.cc文件,并将该moc.cc文件一起作为源文件进行编译,具体原因参照官网,这里不细说

1. 视频播放器

0. 源文件

video_player

1. 操作界面

初始界面
点击open file之后的播放界面

播放界面

2. 重点注意

  1. 该例子借鉴了上一个计算器的例子,因此在连接信号槽的时候没有使用this来表示函数,因此并无控件无响应等问题
  2. 函数中包含许多connect,addWidget等函数,这些函数都是将指针作为输入参数,因此在使用时必须保证先实例化相应的控件并再将其指针作为参数输入,不能先执行参数,再实例化,这会导致connect到一个野指针
  3. 视频播放依赖于本地的视频解码器,因此需要事先下载一个,例如
    LAVFilters
    否则会出现界面与控件功能都正常,但是就是播放不出视频的问题
  4. 本例子不同于先在QtDesigner中设计好界面然后将设计好的 video_player.ui转换成 ui_video_player.h,而是直接在头文件中声明所需要的控件,并在其对应的cc文件中定义其相应的规则(名字,位置,大小,功能),这样子直接进行文件的编译就可以,不需要依赖于其他软件,若是用QtDesigner设计的ui界面,需要用uic将其转换成ui_video_player.h并需要在video_player.cc里包含该文件并申明一个UI::VideoPlayer *ui来表示控件规则,相当于继承了一些控件类再进行操作
  5. 详见源码

***** 这是一条底线 *****