Qt学习笔记 day_02

24 篇文章 2 订阅
5 篇文章 0 订阅

Qt开发学习笔记

项目开发个人Qt学习记录,前期只是学习相关概念,记录一些基础知识,后面会补充一些具体的操作实例


五、标准对话框

标准对话框,是qt内置的一系列对话框,用于简化开发。有很多对话框都是通用的,例如打开文件、设置颜色、打印设置等。

qt的内置对话框大致分为以下几类:

  • QColorDialog:选择颜色
  • QFileDialog:选择文件或者目录
  • QFontDialog: 选择字体
  • QInputDialog:允许用户输入一个值,并将其值返回
  • QMessageBox:模态对话框,用于显示信息、询问问题等
  • QPageSetupDialog:未打印机提供纸张相关的选项
  • QPrintDialog:打印机配置
  • QPrintPreviewDialog:打印预览
  • QProgressDialog:显示操作过程

消息对话框

在这里插入图片描述

消息提示对话框的函数参数意义:父亲窗口,对话框标题,提示信息,(按键名称可多选),默认关联回车的按键

函数的返回类型是StandardButton类型,利用返回值判断用户的输入

消息对话框有这么几种类型:

  • 错误提示对话框
    在这里插入图片描述

  • 信息对话框
    在这里插入图片描述

  • 提问对话框(离开时退出还是不退出)
    在这里插入图片描述

  • 警告对话框
    在这里插入图片描述

/*头文件:QMessageBox*/
//消息对话框的几种类型
//错误提示对话框
QMessageBox::critical(this(父亲),"critical"(对话框标题),"错误"(提示信息));

//信息对话框
QMessageBox::information(this,"info","信息");

//提问对话框
QMessageBox::question(this,"ques","退出?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
//判断选择结果
if(QMessageBox::Save == QMessageBox::question(this,"ques","退出?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
    qDebug<<"选择了保存";
}
else
{
    QDebug<<"选择了取消";
}

//警告对话框
QMessageBox::warning(this,"warn","警告");

其他对话框

  • 颜色对话框

    QColor color = QColorDialog::getColor(QColor(255,0,255(透明值)));
    qDebug<<"r = "<<color.red() <<"g = "<<color.green()<<"b = "<<color.bule();
    
  • 文件对话框(打开某一文件目录)

    /*头文件:QFileDialog*/
    //参数类型 父亲 对话框标题  默认路径 过滤的文件格式
    //返回值是选取的路径
    QString str = QFileDialog::getOpenFileName(this,"打开目录","C:\\Users\\86187\\Desktop","(*.txt)");
    qDebug<<str;
    
  • 字体对话框

    /*头文件:QFontDialog*/
    bool flag;
    QFont  font = QFontDialog::getFont(&flag,QFont("仿宋",24));
    qDebug<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointsize()<<"是否加粗:"<<font.bold()<<"是否斜体:"<<font.italic();
    
    

六、界面的布局

实现登录窗口布局

  • 1)利用布局方式,给窗口进行美化
  • 2)选取widget进行布局,水平布局、垂直布局、栅格布局
  • 3)给用户名、密码、登录、退出按钮进行布局
  • 4)默认窗口和控件之间有9间隙,可以调整LayoutLeftMargin
  • 5)利用弹簧进行布局

七、常用控件

1.按键组

  • QPushButton:常用按钮(ok、cancel、save…)
  • QToolButton:工具按钮,用于显示图片,若想修改图片风格,修改toolButtonStyle,突起风格autoRaise
  • radioButton:单选按钮,设置默认(如下代码所示)
  • checkBox:多选按钮,监听状态
//设置单选按钮  男默认选中
ui->rntnMan->setChecked(true);

//选中女后 打印信息
connect(ui->rbtnWomen,&QRadionButton::clicked,[=](){
    qDebug<<"选中女了";
});

//多选按钮  0未选中  2 选中  1半选
connect(ui->cBox,&QCheckBox::stateChanged,[=](){
    qDebug<<state;
});

2.QListWidget控件(列表容器)

//利用ListWidget写诗
QListWidgetIten * item = new QListWidgetItem("不知天上宫阙");
//将一行诗放到Listwidget控件中
ui->listWidget->addItem(item);
item->setTextAlihnment(Qt::AlignHCenter);//设置水平居中

//一次放入一组诗句
QStringList list;//等同于QList<Qstring>
list<<"不知天上宫阙"<<"今夕是何年"<<"我欲乘风归去";
ui->listWidget->addItems(list);

3.QTreeWidget树控件

示例:

流程:

  • 设置头
  • 创建根节点
  • 添加根节点到树控件上
  • 添加子节点
//TreeWidget树控件使用

//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"人物角色介绍");//QStrinList()用到了匿名对象

QTreeWidgetItem * wangItem = new QTreeWidgetItem(QStringList()<<"王者荣耀");
QTreeWidgetItem * chiItem = new QTreeWidgetItem(QStringList()<<"和平精英");

//加载顶层结点
ui->treeWidget->addTopLevelItem(hongItem);
ui->treeWidget->addTopLevelItem(xiItem);

//追加子节点
QStringList role1;
role1<<"王昭君"<<"法师、控制、团位";
QTreeWidgetItem * r1 = new QTreeWidgetItem(r1);
hongItem->addChild(r1);

4.QTableWidget表格控件

示例:

在这里插入图片描述

流程:

  • 设置列数
  • 设置水平表头
  • 设置行数
  • 设置正文
//设置列数
ui->tableWidget->setColumnCount(3);

//设置水平头
ui->tableWidget->setHorizontalHeaderLabels(QString()<<"姓名"<<"性别"<<"年龄");

//设置行数
ui->tableWidget->setRowCount(3);

//设置正文
//ui->tableWidget->setItem(0(行坐标),0(列坐标),new QTableWidgetItem("张三"));

//多项同时设置正文
QstringList nameList;
nameList<<"张三"<<"李四"<<"王麻子";

QList<QString> sxList;
sexList<<"男"<<"男"<<"男";

for(int i=0;i<3;++i)
{
    int col = 0;
    ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
    ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList[i]));
    ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+20)));
}

5.其他常用控件

栈控件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

//栈控件使用
//设置默认定位 scrollArea
ui->stackedWidget->setCurrentIndex(1);

//scrollArea按钮
connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
   ui->stackedWidget->setCurrentIndex(1); 
});

//toolBox按钮
connect(ui->btn_TolBox,&QPushButton::clicked,[=](){
   ui->stackedWidget->setCurrentIndex(2); 
});

//TabWidget按钮
connect(ui->btn_TabWIdget,&QPushButton::clicked,[=](){
   ui->stackedWidget->setCurrentIndex(0); 
});

下拉框控件

//下拉框
ui->comboBox->addItem("红楼梦");
ui->comboBox->addItem("西游记");
ui->comboBox->addItem("三国演义");
ui->comboBox->addItem("水浒传");

//点击按钮 选中水浒传
connect(ui->btn_select,&QPushButton::clicked,[=](){
    ui->comboBox->setCurrentText("水浒传");
    //ui->comboBox->setCurrentIndex(3);
})

QLabel标签控件

//利用QLabel显示图片
ui->ibl_Image->setPixmap(QPixmap(":/Image/xxx.png"));

//利用QLabel显示动图
QMovie * movie = new QMovie(":/Image/mario.gif");
ui->ibl_movie->setMovie(movie);
//播放动图
movie->start();

6.自定义控件封装

  • 1)添加新文件 -》Qt设计师界面类 (.h .cpp)
  • 2).ui中设计 QSpinBox 和 QSlider两个控件
  • 3)Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升,填对类名称(建议选择全局
  • 4)实现功能,改变数字,滑条跟着滑动,信号槽监听
  • 5)提供getNUm和setNum对外接口
  • 6)测试接口

SpinBox(数字控件)和horizontalSlider(水平滑动控件)组合为一组控件:

在这里插入图片描述

//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());

追加:点击按钮,获得当前值;点击按钮,设置到一半

在这里插入图片描述

八、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)

在这里插入图片描述

//鼠标进入事件
void enterEvent(Qevent* event);

//鼠标离开事件
void leaveEvent(QEvent *);

//鼠标按下
virtual void mousePressEvent(QMouseEvent* ev);

//鼠标释放
virtual void mouseReleaseEvent(QMouseEvent * ev);

//鼠标移动
virtual void mouseMoveEvent(QMouseEvent* ev);

在这里插入图片描述

//鼠标进入事件
void myLabel::enterEvent(Qevent* event)
{
    qDebug()<<"鼠标进入了";
}

//鼠标离开事件
void myLabel::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开了";
}

//鼠标按下
void myLabel::mousePressEvent(QMouseEvent* ev)
{
    qDebug()<<"鼠标按下了";
}

//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent * ev)
{
    qDebug()<<"鼠标释放了";
}

//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent* ev)
{
    QString str = QString("鼠标按下了 x = %1  y = %2 ").arg(ev->x()).arg(ev->y());
    qDebug()<<str;
}

//当鼠标按下 提示信息
if( ev->button() == Qt::LeftButton)
{
    QString str = QString("鼠标按下了 x = %1  y = %2 ").arg(ev->x()).arg(ev->y());
    qDebug()<<str;
}

效果:

在这里插入图片描述

九、定时器

1.利用定时器事件 void timerEvent(QTimerEvent * ev)

在widget.h中去重写定时器的方法:

//在构造中进行启动定时器
starttimer(1000); //参数1  间隔 单位码毫秒

void Widget::timerEvent(QTimerEvent *)
{
    static int num =1;
    ui->label->setText( QString::number(num++));
}
//两个不同需求的定时器
//定义两个定时器标识(公有成员变量)
int id1,ind2;

//在构造中进行启动定时器
id1= startTimer(1000); //参数1  间隔 单位码毫秒
id2 = startTimer(2000);



void Widget::timerEvent(QTimerEvent *)
{
    if(ev->timerId == id1)
    {
        //label1 每个1秒 +1	
        static int num =1;
    	ui->label->setText( QString::number(num++));
    }
    
    if(ev->timerId == id2)
    {
        //label2每个2秒 +1
        static int num2 =1;
        ui->label->setText( QString::number(num2++));}
}

2.利用Timer类来做定时器(这种比较独立)

QTimer * timer  = new QTimer(this);
//启动定时器
timer->start(500);

connect(timer,&QTimer::timeout,[=](){
   static num =1;
    //label3 每隔0.5秒 +1
    ui->label3->setText(QString::number(num++));
});

//点击暂停按钮 实现停止定时器
connect(ui->btn,&QPushButton::clicked,[=](){
    timer->stop();
});

十、event事件分发器

在这里插入图片描述

event事件:

  • 用于事件的分发
  • 可以做拦截,但是不建议
  • bool event(QEvent *e)
  • 返回值 如果是true代表用户处理了这个事件,不向下分发了
  • e->type() == 鼠标按下 ,这样类似的来判断

十一、事件过滤器

在这里插入图片描述

  • 1)给控件安装事件过滤器
ui->label->installEventFilter(this);
  • 2)在widget.h中重写事件过滤器的事件
bool eventFilter(QObject * ,QEvent *);

//步骤2 重写eventFilter事件
bool eventFilter(QObject * obj,QEvent *e)
{
    if( obj == ui->label )
    {
        if(e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent * ev = static_cast<QMouseEvent*>(e);
            QString str= Qstring("事件过滤器中:鼠标按下了 x=%1  y=%2").arg(ev->x()).arg(ev->y());
            qDebug()<<str;
            
            return true;
        }
    }
    
    //其他默认处理,交给父类
    return QWidget::eventFilter(obj,e);
}

十二、绘图事件

1.绘图

//绘图事件
void paintEvent(QPainEvent *);

void widget::paintEvent(QPaintEvent*)
{
    //实例化画家对象 this指定的是绘图设备
    QPainter Painter(this);
    
    //先设置画笔
    
    Qpen pen(QColor(255,0,0));//红色
    //设置画笔宽度 
    pen.setWidth(30); 
    //设置画笔风格
    pen.setStyle(Qt::DotLine);
    //让画家 使用这个画笔
    painter.setPen(pen);
    
    //设置画刷
    QBrush brush(Qt::cyan);
    //设置画刷风格
    brush.setStyle(Qt::Dense7Pattern);
    //让画家使用画刷
    painter.setBrush(brush);
    
    //画线
    painter.drawLine(QPoint(0,0), QPoint(100,100));
    
    //画圆 椭圆    
    painter.drawEllipse(QPoint(100,100),100,50);//参数 圆心左边,rx,ry
    
    //画矩形
    painter.drawRect(QRect(20,20,50,50));
    
    //画文字 
    painter.drawText(QRect(10,200,150,50),"玫瑰色花猫");
}

在这里插入图片描述

画笔的风格(Qt::PebStyle):


:67%;" />

画刷的风格:

在这里插入图片描述

2.QPainter高级设置

QPainter painter(this);
painter.drawEllipse(QPoint(100,50),50,50);
//设置 抗锯齿能力(清晰度)  升高效率会低
painter.setRenderHint(QPainter::Antiliasing);//清晰

painter.drawEllipse(QPoint(200,50),50,50);


//画矩形
painter.drawRect(QRect(20,20,50,50));

painter.translate(100,0);//画家移动了位置

//保存画家位置
painter.save();

painter.drawRect(QRect(20,20,50,50));

painter.translate(100,0);//画家移动了位置

//还原画家保存状态
painter.restore();

painter.drawRect(QRect(20,20,50,50));

在这里插入图片描述

3.手动调用绘图事件

//利用画家 画资源图片
//实例化画家对象 this指定的是绘图设备
QPainter Painter(this);
painter.drawPixmap(20,0,QPixmap(":/Image/xx.png"));

//点击按钮,移动图片
//widget.h中添加 posX成员变量表示画家位置
int posX;

//构造函数中 连接信号和槽
connect(ui->btn,&QPushButton::clicked,[=](){
    PosX+=10;
    //若要手动调用绘图事件  用update()
    update();
});


void widget::paintEvent(QPaintEvent*)
{
    //实例化画家对象 this指定的是绘图设备
    QPainter Painter(this);
    
    //如果超出屏幕  从0开始
    if(posX> this->width())
    {
        posX=0;
    }
painter.drawPixmap(posX,0,QPixmap(":/Image/xx.png"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值