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的更多相关文章

  1. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  2. Ubuntu 下安装QT

    Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...

  3. Qt安装配置

    Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...

  4. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  5. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  6. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  7. Qt——组件位置随窗口变化

    当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...

  8. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  9. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  10. Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题

    最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...

随机推荐

  1. [转帖]harbor镜像仓库清理操作

    https://www.cnblogs.com/FengGeBlog/p/15517706.html 两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ce ...

  2. 人大金仓学习之四-kmonitor

    人大金仓学习之四-kmonitor 背景 kmonitor 其实时一个很好的工具和思路 开元的软件封装一下, 减轻技术复杂度,提高部署效率 并且能够更加快速的定位解决问题. 能够极大的提升客户体验. ...

  3. [转帖]Jmeter学习笔记(九)——响应断言

    Jmeter学习笔记(九)--响应断言 https://www.cnblogs.com/pachongshangdexuebi/p/11571348.html Jmeter中又一个元件叫断言,用于检查 ...

  4. [转帖]Java和Scala的前世今生

    第一部分:Java 计算机语言介绍 第一代语言:机器语言.指令以二进制代码形式存在 第二代语言:汇编语言.使用助记符表示一条机器指令 第三代语言:高级语言 C.Pascal.Fortran面向过程的语 ...

  5. [转帖]Veeam Backup & Replication 10.0.0.4461安装部署(包含补丁)

    原文:https://www.cnblogs.com/cnzay/p/15561893.html Veeam Backup & Replication 是一款数据保护软件,为VMware 和H ...

  6. [转帖]引人入胜,实战讲解“Java性能调优六大工具”之linux命令行工具

    Java性能调优六大工具之Linux命令行工具 为了能准确获得程序的性能信息,需要使用各种辅助工具.本章将着重介绍用于系统性能分析的各种工具.熟练掌握这些工具,对性能瓶颈定位和系统故障排查都很有帮助. ...

  7. ESXi规避ESXiArgs勒索软件的简单方法

    摘要 今天查看深信服科技的公众号 发现有一个ESXiArgs 的勒索软件. 感觉对公司存在一定的风险.但是感觉操作手册有点简单. 这里想着写全面一点. 作为操作手册使用. 并且深信服仅是解决了在运行, ...

  8. vue render函数的简单使用(1)

    1.render函数的介绍 在vue中我们经常使用HTML模板语法来组建页面. 除此之外,使用还可以使用render函数来创建页面. 因为vue是虚拟DOM,拿到template模板时也要转译成VNo ...

  9. 你不知道的Promise构造函数Promise(excutor)

    Promise构造函数Promise(excutor) // 说明一下:excutor会在Promise内部立刻同步调用:(异步操作在执行器执行) var p = new Promise((resol ...

  10. RIPEMD加密技术探究:优势、劣势与实战应用

    摘要:RIPEMD加密算法作为一种哈希算法,自1989年诞生以来,因其高效.安全的特性在网络安全领域得到了广泛的应用.本文将对RIPEMD算法的优缺点进行详细分析,并给出一个Java完整的示例代码.同 ...