QT学习笔记(7)-布局与自定义控件与事件

本篇文章是对b站学习视频上面的一些总结与笔记,觉得这个视频还是不错的,值得花时间去听,那样才能更好的打好基础。共勉!这里也贴上一个这个视频的文档资料:https://pan.baidu.com/s/1x8dT6xorLa0jaNe8Wdd0IQ 提取码:8sdy

目录

  • 布局与自定义控件
  • QT消息机制和事件

布局与自定义控件

首先,对ui进行页面的基本布局:
基本上是这样的:
QT学习笔记(7)-布局与自定义控件与事件_第1张图片
主要里面有四个Widget,然后进行一定的页面布局就可以 了。一般这里是都使用的是水平布局。
运行结果为:
QT学习笔记(7)-布局与自定义控件与事件_第2张图片
那个弹簧是会没掉的,放心。
注意最下面那个滑竿。是自定义控件弄出来的。
首先:
你需要变在编辑中编写一个类控件,例如这样:

#include "smallwidget.h"
#include 
#include 
#include 
SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)
{
    //这里就是自定义控件的用法
       QSpinBox *spin = new QSpinBox(this);
       QSlider *slider = new QSlider(Qt::Horizontal,this);
       //把控件添加到布局中
       QHBoxLayout *hLayout = new QHBoxLayout;
       hLayout->addWidget(spin);
       hLayout->addWidget(slider);
       setLayout(hLayout);
       //注意,这里编写完成后,你还要在ui,界面那里把Widget提升为你要关联的那个类名,这样,
       //你在这边编写的函数才能在ui那边进行显示,注意,选择确定的类就可以了。
}

编写完后,到ui界面就是控件提升:
具体操作如下:
先放一个widget:
QT学习笔记(7)-布局与自定义控件与事件_第3张图片
右键点击:
QT学习笔记(7)-布局与自定义控件与事件_第4张图片
选择下面的提升为,因为你是第一次提升。
QT学习笔记(7)-布局与自定义控件与事件_第5张图片
然后把你自定义的类填写下去,点提升就可以了。
你就会出现,你编写的类中的东西了。

这时,你可能需要保证说两个控件的滑块数值改变的时候,相互关联。这时就用到connnect函数了

  connect(spin,static_cast<void (QSpinBox::*) (int)>(&QSpinBox::valueChanged),slider,&QSlider::setValue);
 connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue);

注意观察函数的参数的类型,若有两种参数传值类型,就要进行强制类型转换了。类型转换主要方式为:static_cast
,与之类似。

QT消息机制和事件

首先,先展示一下运行效果:
QT学习笔记(7)-布局与自定义控件与事件_第6张图片

  1. 这里面主要分为好几部分:
    首先,是通过鼠标在界面的移动,指出页面的坐标。
    主要代码
	int i = ev->x();
   int j = ev->y();
   QString text=QString("

Mouse Release:(%1,%2)

"
).arg(i).arg(j); this->setText(text);
  1. 还有就是界面的移入与移出:
    主要代码如下:
 QString text=QString("

Mouse Enter

"
); this->setText(text);
  1. 时间事件:(让其在5秒时停止)
    主要代码如下:
 static int sec = 0;
  ui->label->setText(QString("

Time out:%1

"
).arg((sec++))); if(5==sec){ this->killTimer(this->timerId); }
  1. 鼠标按压事件:
    主要代码如下:
if(ev->button()==Qt::LeftButton)
  {
      qDebug()<<"left";

  }
      else if(ev->button()==Qt::RightButton){
      qDebug()<<"right";
  }
  else if(ev->button()==Qt::MidButton){
      qDebug()<<"Mid";

  }
  1. 事件的接收与忽略:
//搞这个,是要证明,在mywidget上面的signal被忽略了,
    if(e->button()==Qt::LeftButton)
    {
        qDebug()<<"The pressed is left";
        e->ignore();//忽略,事件继续往下传递,给谁传递。
        //事件传递给了父组件,不是传递给父类(基类)
    }
    else {
       //不做处理
    }
    //而如果这样做的话,就会回去再打印那个QWidget中的按钮的功能。
     QPushButton::mousePressEvent(e);

其实这里,这样做不理解是正常的,我觉得用CloseEvent来解释,确实会好一点。
代码

void MyWidget::closeEvent(QCloseEvent *event)
{
    int ret = QMessageBox::question(this,"question","whether need to close the window?");
    if(ret ==QMessageBox::Yes){
        //关闭窗口
        //处理关闭窗口事件,接受事件,事件就不会再往下传递
        event->accept();
    }
    else {
        //不关闭窗口
        event->ignore();
    }
}

就是你要关闭的这个事件,用你接下来的QMessageBox的值来判断,进而得到是要忽略还是要关闭呢!

  1. 键盘按键事件:
    主要代码:
//这是判定按键的,打印出来都是ASC2的值
void MyWidget::keyPressEvent(QKeyEvent *qe)
{
    qDebug()<<qe->key();
    if(qe->key()==Qt::Key_A){
        qDebug()<<"Qt::key_A";
    }
}

基本今天的内容就是这样了。
要运行的代码的话,我给一个那个网站所给的链接:
https://pan.baidu.com/s/10X7iEZGkpk3zWckEuI9YyQ 提取码:xgkj
直接在这里拿就行了,但好像是QT4的。运行不了,但代码都是对的,你可以试试看,有可能运行不了只是我的问题。

你可能感兴趣的:(QT)