Qt学习第2天:常用控件与事件 【笔记】
发布日期:2021-07-01 04:00:39
浏览次数:2
分类:技术文章
本文共 8430 字,大约阅读时间需要 28 分钟。
文章目录
1. 常用控件
Input Widgets:
- Line Edit:单行文本输入
- 设置文本:
setText()
,ui->lineEdit->setText("654321");
- 获取文本:
text()
,QString str = ui->lineEdit->text(); //获取内容
- 设置文本:
- Text Edit:可显示文本和图片
- Plain Text Edit:只能显示文本
Display Widgets:
- Label:可显示文字、图片、动画、网址等等
- LCD Number:数码管
- Progress Bar:进度条
#include "mainwindow.h"#include "ui_mainwindow.h"#include#include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); //获取内容 QString str = ui->lineEdit->text(); qDebug() << str ; //设置内容 ui->lineEdit->setText("654321"); //设置内容显示间隙 ui->lineEdit->setTextMargins(15,0,0,0); //设置内容显示方式// ui->lineEdit->setEchoMode(QLineEdit::Password); // 内容提示框 QStringList list; list << "Hello" << "how are you" << "test"; QCompleter *com = new QCompleter(list,this); com->setCaseSensitivity(Qt::CaseInsensitive); ui->lineEdit->setCompleter(com); //QLabel //设置文本内容 ui->labelText->setText("^_^"); //设置图片 ui->labelImage->setPixmap(QPixmap("://Image/image2.png")); //让图片自动适应大小 ui->labelImage->setScaledContents(true); //创建动画 QMovie *myMovie = new QMovie("://Image/dog.gif"); //设置动画 ui->labelGif->setMovie(myMovie); //启动动画 myMovie->start(); ui->labelGif->setScaledContents(true); //设置html ui->labelUrl->setText(" 百度一下
"); ui->labelUrl->setOpenExternalLinks(true); //数码控 ui->lcdNumber->display(123); //进度条 ui->progressBar->setMinimum(0);//最小值 ui->progressBar->setMaximum(100);//最大值 ui->progressBar->setValue(15);//当前值}MainWindow::~MainWindow(){ delete ui;}
2. 布局
- 水平布局
- 垂直布局
- 网格布局
3. 自定义控件
写完控件后,在容器上右击Promote to
#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(this); hLayout->addWidget(spin); hLayout->addWidget(slider); //setLayout(hLayout) connect(spin,static_cast (&QSpinBox::valueChanged), slider,&QSlider::setValue); connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue);}
4. Qt样式表
Qt样式表与CSS语法规则几乎完全相同
5.事件
事件
鼠标事件、键盘事件、定时器事件:
以标签显示为例
注意:Qt中少包含头文件
<QTimerEvent>
,编译器也没报错,但是实际定时器事件没有响应。不知是版本问题还是BUG
事件的接收和忽略
event()函数
主要做事件分发
事件过滤器
注意,事件过滤器和被安装过滤器的组件必须在同一线程,否则过滤器将不起作用。另外,如果在安装过滤器之后,这两个组件到了不同的线程,那么只有等到二者重新回到同一线程时过滤器才会有效。
mylabel.h
#ifndef MYLabel_H#define MYLabel_H#includeclass myLabel : public QLabel{ Q_OBJECTpublic: explicit myLabel(QWidget *parent = nullptr);protected: //鼠标点击事件 void mousePressEvent(QMouseEvent *ev); //鼠标释放事件 void mouseReleaseEvent(QMouseEvent *ev); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *ev); //进入窗口区域 void enterEvent(QEvent *); //离开窗口区域 void leaveEvent(QEvent *);signals:public slots:};#endif // MYLabel_H
mylabel.cpp
#include "mylabel.h"#include#include myLabel::myLabel(QWidget *parent) : QLabel(parent){ //要想一进界面就有效 this->setMouseTracking(true);}void myLabel::mousePressEvent(QMouseEvent *ev){ int i = ev->x(); int j = ev->y(); //sprinf /* * QString str = QString("abc %1 ^_^ %2").arg(123).arg("mike"); * str = abc 123 ^_^ mike */ if(ev->button() == Qt::LeftButton) { qDebug() << "鼠标左键被按下!"; }else if(ev->button() == Qt::RightButton) { qDebug() << "鼠标右键被按下!"; }else if(ev->button() == Qt::MidButton) { qDebug() << "鼠标中键被按下!"; } // 可嵌入html语句 QString text = QString(" Mouse Press:(%1,%2)
") .arg(i).arg(j); this->setText(text);}void myLabel::mouseReleaseEvent(QMouseEvent *ev){ QString text = QString("Mouse Release:(%1,%2)
") .arg(ev->x()).arg(ev->y()); this->setText(text);}void myLabel::mouseMoveEvent(QMouseEvent *ev){ QString text = QString("Mouse Move:(%1,%2)
") .arg(ev->x()).arg(ev->y()); //this->setText(text);}void myLabel::enterEvent(QEvent *e){ QString text = QString(""); this->setText(text);}void myLabel::leaveEvent(QEvent *e){ QString text = QString(" Mouse enter
"); this->setText(text);} Mouse leave
mybutton.h
#ifndef MYBUTTON_H#define MYBUTTON_H#includeclass myButton : public QPushButton{ Q_OBJECTpublic: explicit myButton(QWidget *parent = nullptr);protected: void mousePressEvent(QMouseEvent *e);signals:public slots:};#endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h"#include#include myButton::myButton(QWidget *parent) : QPushButton(parent){ }void myButton::mousePressEvent(QMouseEvent *e){ if(e->button() == Qt::LeftButton) { //如果是左键按下 qDebug()<<"按下的是左键"; } else { //不作处理 //QPushButton::mousePressEvent(e); //如果把语句放在这儿,而没有后面那句, //信号被忽略以后便不会继续往下传,因此clicked信号 //就不会被触发,其所对应的槽函数当然也不会被执行 //这种问题务必要注意,可以重写自己的事件, //但执行完后务必保证信号会继续往下传,否则会导致 //后续信号无法继续接收,这种BUG很难找出来!! } //信号忽略,继续往下传 QPushButton::mousePressEvent(e);}
mywidget.h
#ifndef MYWIDGET_H#define MYWIDGET_H#includenamespace Ui { class myWidget;}class myWidget : public QWidget{ Q_OBJECTpublic: explicit myWidget(QWidget *parent = nullptr); ~myWidget();protected: //键盘按下事件 void keyPressEvent(QKeyEvent *); //定时器事件 void timerEvent(QTimerEvent *); //关闭事件 void closeEvent(QCloseEvent *); //重写event事件 bool event(QEvent *); //事件过滤器 bool eventFilter(QObject *,QEvent *);private: Ui::myWidget *ui; int timerID; int timerID2;};#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"#include "ui_mywidget.h"#include#include #include #include #include #include myWidget::myWidget(QWidget *parent) : QWidget(parent), ui(new Ui::myWidget){ ui->setupUi(this); //启动定时器 timerID = this->startTimer(1000);//毫秒为单位,每隔1s触发一次定时器 this->timerID2 = this->startTimer(500); connect(ui->pushButton,&myButton::clicked, [=]() { qDebug() <<"clicked 按钮被按下"; }); //安装过滤器 ui->label_2->installEventFilter(this);}myWidget::~myWidget(){ delete ui;}void myWidget::keyPressEvent(QKeyEvent *e){ qDebug() << (char)e->key(); if(e->key() == Qt::Key_A) { qDebug() << "Qt::Key_A"; }}void myWidget::timerEvent(QTimerEvent *e){ if(e->timerId() == this->timerID) { static int sec = 0; ui->label_3->setText(QString(" ").arg(sec++)); if(5 == sec) { //停止定时器 this->killTimer(this->timerID); } }else if (e->timerId() == this->timerID2) { static int sec2 = 0; ui->label_2->setText( QString(" timer1 out: %1
").arg(sec2++) ); }}void myWidget::closeEvent(QCloseEvent *e){ int ret = QMessageBox::question(this,"question","是否关闭窗口"); if(ret == QMessageBox::Yes) { //关闭窗口 //处理关闭窗口事件,接收事件,事件就不会再往下传递 e->accept(); } else { //不关闭窗口 //忽略事件,事件继续给父组件传递 e->ignore(); }}bool myWidget::event(QEvent *e)//不要轻易改此函数{ //事件分发// switch (e->type()) { // case QEvent::Close:// closeEvent(e);// break;// case QEvent::MouseMove:// mouseMoveEvent(e);// break; if(e->type() == QEvent::Timer) { //干掉计时器 //如果返回true,事件停止传播 QTimerEvent *env = static_cast timer2 out: %1
(e); timerEvent(env); return true; } else if (e->type() == QEvent::KeyPress) { QKeyEvent *env = static_cast (e); if(env->key() == Qt::Key_B) { return QWidget::event(e); } return true; } else { return QWidget::event(e); }}bool myWidget::eventFilter(QObject *obj, QEvent *e){ if(obj == ui->label_2) { QMouseEvent *env = static_cast (e); //判断事件 if(e->type() == QEvent::MouseMove) { ui->label_2->setText(QString("Mouse move:(%1,%2)"). arg(env->x()).arg(env->y())); return true; } else { return QWidget::eventFilter(obj,e); } } return QWidget::eventFilter(obj,e);}
Qt复合快捷键
QString s="";switch(e->modifiers()){ case Qt::ControlModifier: s = "Ctrl+"; break;case Qt::AltModifier: s = "Alt+"; break;}switch(e->key()){ case Qt::Key_Left: s += "Left_Key Press"; break; case ...}
总结
- 控件
- 按钮类:QPushButton、QToolButton、QRadioButton
- item:QListWidget
- 容器类:QStackWidget、QWidget、QFrame、
- 编辑类:QComboBox、QLineEdit、QTextEdit
- 显示类:QLabel、QLCDNumber、QProgressBar
- 布局
- 水平
- 垂直
- 网格
- 布局属性
- 大小策略
- 最小大小
- 最大大小
- 容器(分类)
- 弹簧
- 自定义控件(提升)
- ui的控件和自定义控件的父类(基类)要一致
- 选中ui控件-> 提升
- 常用事件处理
- 事件处理器
- 都是虚函数(基类中定义QWidget QObject)
- 我们派生类(子类)
转载地址:https://miracle.blog.csdn.net/article/details/105874974 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年05月05日 18时03分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2021-05-18
2021-07-03
基础架构系列篇-NGINX部署VUE
2021-07-03
基础架构系列篇-系统centos7安装kafka
2021-07-03
2021年不可错过的17种JS优化技巧(一)
2021-07-03
在 Vue 中用 Axios 异步请求API
2021-07-03
MySQL进阶查询(SELECT 语句高级用法)
2021-07-03
Mysql 之主从复制
2021-07-03
【NLP学习笔记】中文分词(Word Segmentation,WS)
2021-07-03
对于时间复杂度的通俗理解
2021-07-03
如何输入多组数据并输出每组数据的和?
2021-07-03
行阶梯型矩阵
2021-07-03
JAVA学习笔记6 - 数组
2019-04-30
【学习笔记】Android Activity
2019-04-30
location区段
2019-04-30
linux内存的寻址方式
2019-04-30
how2heap-double free
2019-04-30
how2heap-fastbin_dup_consolidate
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
xss-labs详解(上)1-10
2019-04-30