QT - Day 4
1 界面布局
- 实现登录窗口
- 利用布局方式,给窗口类化
- 选取Widget进行布局,水平布局,垂直布局,栅格布局
- 给用户名、密码、登录、退出按钮进行布局
- 默认窗口和控件之间有9间隙,可以调整layoutLeftMargin
- 利用弹簧进行布局
2 控件
- 按钮组
1) QPushButton 常用按钮
2) QToolButton 工具按钮 用于显示图片 文字 修改风格等等
3) toolButtonStyle 凸起风格 autoRaise
4) radioButton 单选按钮, 设为默认
5) checkbox 多选按钮 监听状态 2 选中 1半选 0 未选
6)
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRadioButton>
#include <QListWidgetItem> Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); //设置单选按钮, 默认选择男
ui->rbtman->setChecked(true);
//选择女,打印信息
connect(ui->rbtwomen,&QRadioButton::clicked,[=](){
qDebug()<<"选择女";
}); //多选按钮
connect(ui->ck_1,&QCheckBox::stateChanged,[=](int state){
qDebug()<<state;
}); }
- QListWidget 列表容器
1) QListWigetItem *Item 一行内容
2) ui->listWidget->additem(item)
3) 设置居中方式 item->setTextAlignment(Qt::AlignHCenter);
4) 可以利用 additems 一次性添加所有内容
5)
// ListWidget
// QListWidgetItem *Item = new QListWidgetItem("锄头日当午");
// ui->listWidget->addItem(Item);
// Item->setTextAlignment(Qt::AlignHCenter); QStringList list;
list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
ui->listWidget->addItems(list);
- 其他控件介绍
1) stackedWidget 栈控件
ui->stackedWidget->setCurrentIndex(1);
2) 下拉框
ui->comboxBox->additem(“ABC”);
3) QLabel 显示图片
ui->lbl_Image->setPixmap(QPixmap(“:/Image/panda.png”));
4) QLabel 显示动图
ui->lbl_movie->setMovie(movie);
movie->start();
5) TableWidget控件的代码使用
//设置列数
ui->tableWidget->setColumnCount(3);
//设置行数
ui->tableWidget->setRowCount(5);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置正文
// ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
QStringList nameList;
nameList<<"亚瑟"<<"张飞"<<"关羽"<<"刘备"<<"花木兰";
QList<QString> setList;
setList<<"男"<<"男"<<"男"<<"男"<<"女"; for(int i=0;i<5;i++)
{
int col = 0;
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(setList.at(i)));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18))); }
效果:
3. 自定义控件
- 添加新文件 – Qt – 设计师界面类 (.h .cpp .ui)
- ui中设计 QSpinBox和 QSlider 两个控件
- Widget中使用自定义控件, 拖着一个Widget,点击提升为, 点击添加,点击提升
- 实现功能,改变数字,滑动条跟着移动,信号槽监听
- 提供getNum和setNum 对外接口
- 测试接口
SmallWidget.cpp
#include "smallwidget.h"
#include "ui_smallwidget.h"
#include <QSpinBox>
#include <QSlider> SmallWidget::SmallWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SmallWidget)
{
ui->setupUi(this);
//QSpinBox 移动 QSlider移动 void (QSpinBox:: *spSignal)(int) = &QSpinBox::valueChanged;
connect(ui->spinBox, spSignal,ui->horizontalSlider, &QSlider::setValue); //QSlider滑动 QSpinBox数字跟着改变
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue); } SmallWidget::~SmallWidget()
{
delete ui;
} int SmallWidget::getnum()
{
return ui->spinBox->value();
} void SmallWidget::setnum(int num)
{
ui->spinBox->setValue(num);
}
SmallWidget.h
#ifndef SMALLWIDGET_H
#define SMALLWIDGET_H #include <QWidget> namespace Ui {
class SmallWidget;
} class SmallWidget : public QWidget
{
Q_OBJECT public:
explicit SmallWidget(QWidget *parent = nullptr);
~SmallWidget(); void setnum(int num);
int getnum(); private:
Ui::SmallWidget *ui;
}; #endif // SMALLWIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); //获取值
connect(ui->btn_1,&QPushButton::clicked,[=](){
qDebug()<<ui->widget->getnum();
}); //设置值
connect(ui->btn_2,&QPushButton::clicked,[=](){
ui->widget->setnum(50);
});
} Widget::~Widget()
{
delete ui;
}
4. Qt中的事件
- 鼠标事件
- 鼠标进入事件 enterEvent
- 鼠标离开事件 leaveEvent
- 鼠标按下 mousePressEvent(QMouseEvent *ev)
- 鼠标释放 mouseReleaseEvent
- 鼠标移动 mouseMoveEvent
- ev->x() x坐标 ev->y() y坐标
- ev->button() 判断鼠标左右按键 Qt::LeftButton Qt::RightButton
- ev->buttons() 判断组合按键 判断move时候的左右键 结合 & 操作符
- 格式化字符串 QString(“%1 %2”).arg(111).arg(222)
myLabel.cpp
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent> MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
//设置鼠标追踪状态
setMouseTracking(true); //没有这个api的话,鼠标移动时将不会触发mousemoveEvent事件
} void MyLabel::enterEvent(QEvent *event)
{
qDebug()<<"鼠标进入";
} void MyLabel::leaveEvent(QEvent *)
{
qDebug()<<"鼠标离开";
} void MyLabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标按下了 x = %1 y = %2 globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
} void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
// if(ev->buttons() &Qt::LeftButton)
// {
QString str = QString("鼠标移动了 x = %1 y = %2 globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
// } }
myLabel.h
#ifndef MYLABEL_H
#define MYLABEL_H #include <QLabel> class MyLabel : public QLabel
{
Q_OBJECT
public:
explicit MyLabel(QWidget *parent = nullptr); //鼠标进入
void enterEvent(QEvent*event); //鼠标离开
void leaveEvent(QEvent*); //鼠标按下
void mousePressEvent(QMouseEvent *); //鼠标移动
void mouseMoveEvent(QMouseEvent *ev); signals: }; #endif // MYLABEL_H
5. 定时器1
- 利用事件 void timerEvent(QTimerEvent *ev)
- 启动定时器 startTimer(1000) 毫秒单位
- timerEvent 的返回值是定时器的唯一标志 可以和ev->timerid 来做比较
6. 定时器2
- 利用定时器类 QTimer
- 创建定时器对象 QTimer *timer = new QTimer(this);
- 启动定时器 timer->start(毫秒)
- 每隔一定毫秒,发送信号 timeout,进行监听
- 暂停 timer->stop()
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); id1= startTimer(1000);
id2 = startTimer(2000); //第二种定时器的方法
QTimer *timer = new QTimer();
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
static int num2 = 1;
ui->label_4->setText(QString::number(num2++));
}); connect(ui->btn, &QPushButton::clicked,[=](){
timer->stop();
});
} Widget::~Widget()
{
delete ui;
} void Widget::timerEvent(QTimerEvent *ev)
{
static int num = 1;
static int num1 = 1;
if(ev->timerId() == id1)
{
ui->label_2->setText(QString::number(num++));
}
if(ev->timerId() == id2)
{
ui->label_3->setText(QString::number(num1++));
}
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget> QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = nullptr);
~Widget(); void timerEvent(QTimerEvent *);
int id1;
int id2; private:
Ui::Widget *ui;
};
#endif // WIDGET_H
效果:
QT - Day 4的更多相关文章
- QT内省机制、自定义Model、数据库
本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...
- Ubuntu 下安装QT
Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...
- Qt安装配置
Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- 保持Qt GUI响应的几种方法
最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- Qt——组件位置随窗口变化
当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...
- (转) Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题
最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...
随机推荐
- [转帖]使用 Dumpling 导出数据
16 Contributors 使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份.Dumpling 也支持将 ...
- Jmeter学习之八_测试kafka
Jmeter学习之八_测试kafka 背景 最近在持续学习. 昨天学习了grafana展示Jmeter测试数据库的结果 今天想着能够测试一下kafka验证一下kafka的吞吐量等信息 说干就干的. 遇 ...
- [转帖]mysql8.0的RPM方式安装
https://www.cnblogs.com/asker009/p/15072354.html 1. 下载 https://dev.mysql.com/downloads/ 使用wget下载yum的 ...
- [转帖]Linux—vi/vim批量注释及取消注释
https://www.jianshu.com/p/45c252e9d2b6 应用场景 在开发场景中,经常遇到对一些配置文件进行注释,当然如果确定不用的时候我们可以通过vim中的D命令进行删除.当 ...
- OpenEuler2203 基于容器和本地文件部署Redis Cluster的过程以及简单性能测试
背景 其实文件搭建和集群搭建没有任何区别 这次用先用容器搭建出来,然后测试一下性能 想着再使用本地部署的方式搭建一下. 两项验证容器和基于文件的搭建的性能差异 部分资料来源: https://blog ...
- vue3.2新增指令v-memo的使用
v-memo的讲解 vue3.2中新增了一个性能优化的指令: 这个指令就是v-memo; v-memo:可以做性能优化,v-memo中值若不发生变化,整个子树的更新会被跳过. <div v-me ...
- 微信小程序之某个节点距离顶部和底部的距离 createSelectorQuery
这个方法可以用来在上滑滚动的时候,让某一个区域置顶, 在下滑的时候,又变为原来的位置哈! <huadong :class="{'hident':isFixed}" id=&q ...
- golang实现的 https 协议的四层代理和七层代理
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 四层代理 在 tcp 这一层转发很简单. http 协议是 ...
- Mygin实现中间件Middleware
本篇是mygin的第六篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现. 目的 实现中间件Middleware ...
- 设计模式学习-使用go实现命令模式
命令模式 定义 优点 缺点 适用范围 代码实现 命令模式对比策略模式 参考 命令模式 定义 命令模式(Command):将一个请求封装成一个对象,从而是你可用不同的的请求对客户进行参数化:对请求排队或 ...