乐趣区

QT新手笔记01

  1. QT 自定义控件

方法:

  第一步 创建一个 QTProject, 基类为 QWidget(勾选 ui);
  第二步 在.ui 界面中创建所需控件;
  第三步 在这个 Project 中点击 Project 名添加新文件, 添加一个 C ++ class, 继承 QWidget;
  第四步 在这个的.ui 中拖一个 Widget 控件, 然后选择 Widget 右键提升, 输入第一个的类名;
  第五步 关联第一个类中的控件之间的联系.

例子:horizintalSlider and spinbox

api(片段):

 setRange(0,100)
 connect(ui->horizontalSlider,&QSlider::valueChanged,[=](int value){ui->spinBox->setValue(value);
 connect(ui->spinBox,
 static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
 ui->horizontalSlider,&QSlider::setValue);

拓展:

set two PushButtons and one can get the value of the horizontalSlider, 
the another one can set the value of the horizontalSlider.

Mind:

在第一个创建的自定义 Widget 中给出 2 个函数, int get_value()----the first PushButton 和 void set_value(int value)---
the second PushButton, 最后通过按钮的槽函数就可以实现了.
  1. 常用事件处理

方法: 在所有组件的父类 QWidget 中,定义了很多事件处理的函数,如
◼ keyPressEvent():键盘按键按下事件
◼ keyReleaseEvent():键盘按键松开事件
◼ mouseDoubleClickEvent():鼠标双击事件
◼ mouseMoveEvent():鼠标移动事件
◼ mousePressEvent():鼠标按键按下事件
◼ mouseReleaseEvent():鼠标按键松开事件
◼ 等等
这些函数都是 protected virtual 的,也就是说,我们可以在子类中重新实
现这些函数。

例子:

  第一步 创建一个 QTProject, 基类为 QWidget(勾选 ui);
  第二步 在.ui 中拖一个 Label 的控件;
  第三步 在这个 Project 中点击 Project 名添加新文件, 添加一个 C ++ class, 继承 QLabel;
  第四步 把窗口的 Label 控件提升为第三步创建的类;
  第五步 在新建类中重写方法中的虚函数.
  

api(片段):

头文件  #include<QMouseEvent>
// 设置一开始就有鼠标跟踪
setMouseTracking(true)
void mousePressEvent(QMouseEvent *e):
e->x;
e->y;
int button=e->button();
if(button==Qt::LeftButton);
.. button==Qt::RightButton;
.. button==Qt::RightButton;
..//Label 支持 html 的写法
QString str=QString("<h1><center>pressed[%1,%2]</center></h1>").
arg(x).arg(y);
this->setText(str);

void mouseMoveEvent(QMouseEvent *e):
其他同上, 补充如下
int button=e->buttons();
..if(buttons & Qt::LeftButton)
..if(buttons & Qt::RightButton)
..if(buttons & Qt::MidButton)

3. 事件分发器(事件分发函数)
作用: 分发各种事件到事件处理函数中.

方法:

  第一步 创建一个 QTProject, 基类为 QWidget(勾选 ui);
  第二步 在.ui 中拖一个 Label 的控件;
  第三步 在这个 Project 中点击 Project 名添加新文件, 添加一个 C ++ class, 继承 QLabel;
  第四步 把窗口的 Label 控件提升为第三步创建的类;
  第五步 在新建类中重写事件分发函数.
  

api:

 // 事件分发函数
 bool myLabel::event(QEvent *e)
 {
// 如果返回值是 true, 表示事件被处理了
// 如果返回值是 false,表示事件没有被处理
比如:if(e->type()==QEvent::MouseMove)
{return true;}
// 让其他事件传递下去
return QLabel::event(e);
}

4. 事件过滤器
作用:

 1. 事件到达窗口之前要经过事件过滤器
 与事件分发器不同的地方: 如果窗口中有多个 label,那么点击多个 label,这时,多个 label 都可以接收到鼠标点击事件,如果要截取鼠标点击事件,那么可以从事件过滤器中统一截取;
 2. 事情过滤器是一个 object 的对象或子类的对象;
 3. 事件过滤器需要安装;
 4. 在 object 的对象或子类对象中重写事件过滤器函数.

方法一:

   第一步 创建一个 QTProject, 基类为 QWidget(勾选 ui);
   第二步 在.ui 中拖一个 Label 的控件;
   第三步 在这个 Project 中点击 Project 名添加新文件, 添加一个 C ++ class, 继承 QLabel;
   第四步 把窗口的 Label 控件提升为第三步创建的类;
   第五步 在这个新建的类中重写了事件过滤器函数.

api:

// 重写事件过滤器函数
bool myLabel::eventFilter(QObject *watched, QEvent *event)
{
// 返回值是 true,表示该事件受到拦截,不会到达窗口
// 返回值是 false, 表示该事件没有受到拦截
if(event->type()==QEvent::MouseButtonPress)
{return true;}
return false;
}
Finally:// 新建的 Label 类构造函数中, 安装事件过滤器
       this->installEventFilter(this);

方法二:

   第一步 创建一个 QTProject, 基类为 QWidget(勾选 ui);
   第二步 在.ui 中拖一个 Label 的控件;
   第三步 在这个 Project 中点击 Project 名添加新文件, 添加一个 C ++ class, 继承 QLabel;
   第四步 把窗口的 Label 控件提升为第三步创建的类;
   第五步 再创建一个类,继承 Object;
   第六步 在该类中重写了事件过滤器函数;

api:

#include<QEvent>// 事件过滤器的头文件
bool myEvent::eventFilter(QObject *watched, QEvent *event)
{
// 返回值是 true,表示该事件受到拦截,不会到达窗口
// 返回值是 false, 表示该事件没有受到拦截
if(event->type()==QEvent::MouseButtonPress)
{//return true;}
return false;
}
Finally:// 安装事件过滤器, 在新建的继承 Label 的类中
myEvent *filter=new MyEvent(this);
this->installEventFilter(filter);
退出移动版