共计 2990 个字符,预计需要花费 8 分钟才能阅读完成。
- 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, 最后通过按钮的槽函数就可以实现了.
- 常用事件处理
方法: 在所有组件的父类 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);
正文完