目录
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是按钮类的抽象基类,因此内部包含了按钮的基本属性和函数。
常用属性:
图标文件可以通过下面的网站下载:
按钮类常用信号函数:
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);
}