概述
在之前的代码中没有使用系统提供的UI。在接下来的代码中我们开始使用系统自带的ui文件,此时窗口cpp文件里的构造函数变为
myWindow::myWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::myWindow) //注释的三处为新增内容
{
ui->setupUi(this); //
}
myWindow::~myWindow()
{
delete ui; //
}
这时我们双击ui文件进入窗口编辑区,通过拖拽即可添加组件。我们想要在函数中引用组件,语法为ui->组件名,其后与之前内容相同。
比如
ui->button1->setText("123"); //new
QPushButton *btn=new QPushButton(this); //before
btn->setText("123");
这些是组件名
接下来我们自定义组件,即编写原有组件的继承类以实现更多功能。添加myLabel.h .cpp(先添加QWidget,然后改成QLabel)
在这里我们为标签定义了鼠标事件
//mylabel.h
#include <QLabel>
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
protected: //定义了鼠标事件
void mousePressEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
signals:
};
//mylabel.cpp,#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
void myLabel::mouseMoveEvent(QMouseEvent *ev){
//默认为false,在false的情况下只有点击了之后才可以追踪鼠标的移动
this->setMouseTracking(true);
int i=ev->x();
int j=ev->y();
//QString内部可以使用html语言来修改显示格式,
//用%1,%2来传参,参数来自arg(i),语法类似printf
QString text=QString("<center>pos:%1,%2</center>").arg(i).arg(j);
this->setText(text);
}
void myLabel::mousePressEvent(QMouseEvent *ev){
if(ev->button()==Qt::RightButton){
//定义了右键点击的事件
qDebug() << "right";
}
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev){}
将自定义组件应用的方法:在编辑器拖入label,右键->提升为->在基类输入刚才编辑的类名->点右边添加->点下方提升,此时添加的label就从QLabel类提升到MyLabel类(可以理解为所属的类更精确了)
这时我们添加的标签便可以追踪鼠标的行为
接下来我们在window定义定时器(来自系统的行为)
在头文件添加
protected:
void timerEvent(QTimerEvent *);
private:
int clock_1;
int clock_2;
然后在cpp当中
myWindow::myWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::myWindow)
{
ui->setupUi(this);
//在构造函数创建定时器(用int来区分不同的定时器)
//参数为两次启动定时器的时间间隔,单位ms(1000ms=1s)
clock_1=this->startTimer(1000);
clock_2=this->startTimer(500);
}
myWindow::~myWindow()
{
delete ui;
}
void myWindow::timerEvent(QTimerEvent *e){
//用e->timerId()来区分不同的定时器,执行不同的行为
if(e->timerId()==this->clock_1){
static int a = 0;
a++;
ui->la1->setText(QString("time:%1").arg(a));
if(a==10){
this->killTimer(clock_1); //传递参数,关闭定时器
}
}
if(e->timerId()==this->clock_2){
static int a = 0;
a++;
ui->la2->setText(QString("time:%1").arg(a));
}
}
执行结果是两个标签显示的文字在以不同的速度计数
参考:https://www.bilibili.com/video/av20446734?p=30
最后
以上就是顺心黑米为你收集整理的【Qt】事件,自定义控件的全部内容,希望文章能够帮你解决【Qt】事件,自定义控件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复