QT学习第四课

目录

1. Designer 设计师

2. 布局Layout

3. QWidget类

4. 界面文件与C++代码的关系

5. QLabel标签

6. QAbstractButton 按钮类

7. QLineEdit 单行文本输入框

8. ComboBox 组合框

9. 若干与数字相关的组件


1. Designer 设计师

Qt包含了一个Designer程序

,用于通过可视化界面设计开发界面,保存的文件格式为.ui(界面文件)。界面文件内部使用xml标签式语言。

在Qt Creator中创建项目时,选中界面文件选项,可以让自带的窗口来使用界面文件。

可以看到在项目中会添加一个界面文件,双击此文件,可以直接使用内置的Designer程序打开并设计。

Designer程序面板区域划分如下:

所有Designer中做的操作都可以通过C++实现。

2. 布局Layout

可以把布局看做成一个透明的盒子、箱子,内部可以放置子组件,这些内部的子组件会按照布局预设的规则自动排布。

垂直布局:内部的组件竖着排成一排。

水平布局:内部的组件横着排成一排。

格栅布局:内部组件排布成n*m的方块。

表单布局:内部组件排布成n*m的表格。

垂直布局和水平布局的使用方式类似的,只有方向不同,常用属性如下:

选中布局后,点击

(快捷工具栏)可以打破布局。

布局可以贴合窗口,只要选中窗口对象,再次点击

按钮之一即可

使用

伸展器组件可以填充空白。

布局可以嵌套,对于外层布局而言,内层布局相当于一个外层布局的子组件。

【例】

3. QWidget类

QWidget的属性在Designer中显示为淡黄色,下面是一些常用的属性:

4. 界面文件与C++代码的关系

5. QLabel标签

QLabel用于显示文字或图片,需要注意的是,QLabel不能与用户交互,只能展示使用,因此没有适合的信号函数。

QLabel常用属性如下:

Qt可以直接从本地读取图片,支持绝对路径和相对路径,但是并不建议这么做,原因是换一台计算机运行程序时,这些图片路径可能会发生变化。

建议先把图片导入项目中,成为项目资源,直接使用Qt虚拟的资源路径导入图片,可以在任何环境下使用这些资源图片。

Qt支持以下几种常用的图片格式:

jpg(不包含透明度)、png(包含透明度)、gif(动图)等

注意:导入的图片不能特别大(分辨率过高或文件体积过大),因为图片的操作非常消耗程序资源。

下面是导入图片成为项目资源的操作步骤:

1. 把命名好(不能包含中文字符)的图片文件放置到工作目录中。

2. 在Qt Creator中选中“项目名称”,鼠标右键,点击“添加新文件”。

3. 在弹出的窗口中,按照下图所示进行操作。

4. 在弹出的窗口中给资源文件命名,例如res

5. 在项目管理界面,直接点击完成。可以看到在项目中多了一个.qrc格式的资源文件。

6. 选中qrc 文件,点击

,可以给资源文件新建一个虚拟路径。

7. 选中qrc文件,点击

可以导入图片到项目中,成为资源文件。

8. 导入成功后,可以qrc文件中看到导入成功的图片。

9. 点击

重新构建项目,然后就可以在Designer找到图片资源并且使用了!

用代码添加图片:

// 在资源文件下的路径
QPixmap::QPixmap(const QString & fileName)

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QDebug>
#include <QPixmap> // 图片类
#include <QSize> // 大小类
#include <QMovie> // 电影类
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
    QMovie * movie; // 电影对象用于播放Gif
 
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 创建一个图片对象
    // 图片资源的路径(qrc文件中选中图片鼠标右键复制)
    QPixmap pic(":/new/prefix1/ji.jpg");
    // 创建一个QSize对象
    // 参数:宽高
    QSize size(ui->label->width(),ui->label->height());
    // 缩放
    // 参数1 QSize
    // 参数2 缩放模式Qt::AspectRatioMode的枚举值
    // 参数3 以速度优先还是质量优先
    // 返回值 转换后的对象
    pic = pic.scaled(size,Qt::IgnoreAspectRatio,Qt::FastTransformation);
    // 使用界面文件中的组件对象
    ui->label->setPixmap(pic);
 
    // 创建电影对象
    // 参数为资源路径
    movie = new QMovie(":/new/prefix1/zyntm.gif");
    // 给QLabel设置电影
    ui->label_gif->setMovie(movie);
    // 播放电影
    movie->start();
}
 
Dialog::~Dialog()
{
    delete ui;
    delete movie;
}

Tips:找不到资源文件的解决办法

1. 左上角可以找到

2. ctrl + tab

3. 右键点击此处

6. QAbstractButton 按钮类

QAbstractButton是按钮类的抽象基类,因此内部包含了按钮的基本属性和函数。

常用属性:

图标文件可以通过下面的网站下载:

iconfont-阿里巴巴矢量图标库

按钮类常用信号函数:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QDebug>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
private slots:
    // 按钮点击后的槽函数
    void btnClickedSlot();
    // 与void toggled(bool)连接的槽函数
    void toggledSlot(bool);
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
    connect(ui->radioButton_2,SIGNAL(toggled(bool)),
            this,SLOT(toggledSlot(bool)));
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::btnClickedSlot()
{
    // 主动获取按钮状态,以肯德基和茅台为例
    bool result = ui->radioButton_3->isChecked();
    qDebug() << "吃肯德基吗?" << result;
    result = ui->radioButton_4->isChecked();
    qDebug() << "喝茅台吗?" << result;
}
 
void Dialog::toggledSlot(bool result)
{
    qDebug() << "今晚吃不吃面条子?" << result;
}

可以使用QButtonGroup组件对多个按钮进行分组,这是一种按钮的逻辑分组,没有任何UI效果,其主要的目的是用一个信号槽同时监控多个按钮对象的状态。

信号函数如下:

参数中

表示当前触发的按钮对象本身,

表示当前触发的按钮序号。

// 向按钮组内添加按钮
void QButtonGroup::addButton(QAbstractButton * button, int 2id = -1)

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
// 按钮组
#include <QButtonGroup>
#include <QDebug>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
    QButtonGroup *group;
private slots:
    void btnGroupSlot(int,bool);
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    group = new QButtonGroup(this);
    // 添加按钮到按钮组,并设置一个编号(id)
    // 参数1 按钮对象
    // 参数2 编号
    group->addButton(ui->checkBoxC,1);
    group->addButton(ui->checkBoxCpp,2);
    group->addButton(ui->checkBoxjs,3);
    group->addButton(ui->checkBoxCpppp,4);
    group->addButton(ui->checkBoxPy,5);
    group->addButton(ui->checkBoxJava,6);
 
    // 解除互斥
    group->setExclusive(false);
 
    // 连接信号槽
    connect(group,SIGNAL(buttonToggled(int,bool)),
            this,SLOT(btnGroupSlot(int,bool)));
}
 
Dialog::~Dialog()
{
    delete ui;
    delete group;
}
 
void Dialog::btnGroupSlot(int id, bool checked)
{
    if(id == 1)
    {
        qDebug() << "C" << checked;
    }else if (id == 2)
    {
        qDebug() << "C++" << checked;
    }else if (id == 3)
    {
        qDebug() << "Js" << checked;
    }else if (id == 4)
    {
        qDebug() << "C#" << checked;
    }else if (id == 5)
    {
        qDebug() << "Python" << checked;
    }else if (id == 6)
    {
        qDebug() << "Java" << checked;
    }
}

7. QLineEdit 单行文本输入框

QLineEdit用于输入一个单行文本,常用属性如下:

常用信号函数如下:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QDebug>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
private slots:
    // 点击按钮的槽函数
    void btnClickedSlot();
    // 与void textEdited(QString)连接
    void textEditedSlot(QString);
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
 
    connect(ui->lineEdit_2,SIGNAL(textEdited(QString)),
            this,SLOT(textEditedSlot(QString)));
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::btnClickedSlot()
{
    qDebug() << ui->lineEdit->text();
    qDebug() << ui->lineEdit_2->text();
    qDebug() << ui->lineEdit_3->text();
    qDebug() << ui->lineEdit_4->text();
}
 
void Dialog::textEditedSlot(QString text)
{
    qDebug() << "您输入的文字是:" << text;
}

8. ComboBox 组合框

ComboBox 用于选择一个选项,功能类似于单选按钮QRadioButton。

常用属性如下:

常用信号如下:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
 
private slots:
    // 点击按钮槽函数
    void btnClickSlot();
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickSlot()));
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::btnClickSlot()
{
    // 获取用户输入
    QString text = ui->lineEdit->text();
    if(text == "")
        return;
    // 给组合框添加选项
    ui->comboBox->insertItem(0,text);
    // 清空输入
    ui->lineEdit->clear();
}

9. 若干与数字相关的组件

以下组件都是与数字相关。

这些组件有一些公共的属性和函数:

// value属性值发生改变时发射的信号
// 参数为当前的value值
void	valueChanged(int value)

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
 
private slots:
    void valueChangeSlot(int);
};
 
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangeSlot(int)));
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::valueChangeSlot(int value)
{
    ui->horizontalScrollBar->setValue(value);
    ui->verticalScrollBar->setValue(value);
    ui->horizontalSlider->setValue(value);
    ui->verticalSlider->setValue(value);
    ui->spinBox->setValue(value);
    ui->progressBar->setValue(value);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值