一 数据转换
1.1 字符串和数字之间相互转换
QString str = "128.5";
bool ret;
int number = str.toUInt(&ret);
if(ret){
qDebug() << number;
}else
{
qDebug() << "falied";
}
int temp = 128;
QString str1 = QString::number(temp,'f',2);
qDebug() << str1;
float num = 123.456;
QString str2 = QString::asprintf("%.2f",num);
qDebug() << str2;
int num2 = 123;
QString str3 = QString::number(num2,2);
qDebug() << "2进制转换结果: " << str3;
1.2 数据转换练习
- 知识点复习:当前案例并没有进行手动的信号与槽的关联,但是为什么能正常运行,通过
on_pushButtonCount_clicked
,on_pushButtonTen_clicked
等槽函数自动进行关联的,信号发送者pushButtonCount
,槽函数名称clicked,QT会根据slots进行命名解析,也即QT的自动关联是通过函数命名来实现的
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_pushButtonCount_clicked();
void on_pushButtonTen_clicked();
void on_pushButtonTwo_clicked();
void on_pushButtonSixty_clicked();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButtonCount_clicked()
{
float number = ui->lineEdit_number->text().toFloat();
float price = ui->lineEdit_price->text().toFloat();
QString value = QString::number(number * price);
ui->lineEdit_totalPrice->setText(value);
}
void Dialog::on_pushButtonTen_clicked()
{
int value10 = ui->lineEdit_ten->text().toInt();
QString value2 = QString::number(value10,2);
QString value16 = QString::number(value10,16);
ui->lineEdit_two->setText(value2);
ui->lineEdit_sixty->setText(value16);
}
void Dialog::on_pushButtonTwo_clicked()
{
bool ok;
int value2 = ui->lineEdit_two ->text().toInt(&ok,2);
QString value10 = QString::number(value2);
QString value16 = QString::number(value2,16);
ui->lineEdit_ten->setText(value10);
ui->lineEdit_sixty->setText(value16);
}
void Dialog::on_pushButtonSixty_clicked()
{
bool ok;
int value16 = ui->lineEdit_sixty ->text().toInt(&ok,16);
qDebug() << "ok : " << ok;
QString value10 = QString::number(value16);
QString value2 = QString::number(value16,2);
ui->lineEdit_ten->setText(value10);
ui->lineEdit_two->setText(value2);
}
1.3 在1.2基础上,实现显示框数据的可手动增长或减小数据
- 知识点1:
Spin Box
只能输入整数,Double Spin Box
只能输入浮点数,两者对应的头文件分别是#include <QSpinBox> #include <QDoubleSpinBox>
- 知识点2:
Spin Box
和Double Spin Box
直接获取到的就是数据,不是字符串,不需要再用text().toInt
进行数据转换,直接value()
获取值即可
void Dialog::on_pushButtonCount_clicked()
{
int number = ui->spinBoxNumber->value();
float price = ui->doubleSpinBoxPrice->value();
QString value = QString::number(number * price);
ui->lineEdit_totalPrice->setText(value);
}
二 QSlider组件
- 案例,实现滑动R,G,B,透明度四个进度条的值,来控制右侧的面版的颜色
- 知识点:当前案例是通过四个条,也即四个信号公用一个自定义槽来实现的,这里使用了自定义槽,因此需要手动进行信号与槽的关联,自定的槽函数中实现基本功能,也即调色板控制,自定义的信号与槽的初始化函数中,同时实现四个信号与槽的关联
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
//三个信号公用一个自定义槽函数,自定义槽函数需要手动关联
void on_horizontalSlider_valueChanged(int value);
private:
Ui::Dialog *ui;
void initConnect();
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QSlider>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
initConnect();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_horizontalSlider_valueChanged(int value){
int redValue = ui->horizontalSliderRed->value();
int greenValue = ui->horizontalSliderGreen->value();
int blueValue = ui->horizontalSliderBlue->value();
int tmdValue = ui->horizontalSliderTMD->value();
QColor color = QColor::fromRgb(redValue,greenValue,blueValue,tmdValue);
auto pal = ui->textEdit->palette();
pal.setColor(QPalette::Base, color);
ui->textEdit->setPalette(pal);
}
void Dialog::initConnect()
{
connect(ui->horizontalSliderRed,SIGNAL(valueChanged(int)),this, SLOT(on_horizontalSlider_valueChanged(int)));
connect(ui->horizontalSliderGreen,SIGNAL(valueChanged(int)),this, SLOT(on_horizontalSlider_valueChanged(int)));
connect(ui->horizontalSliderBlue,SIGNAL(valueChanged(int)),this, SLOT(on_horizontalSlider_valueChanged(int)));
connect(ui->horizontalSliderTMD,SIGNAL(valueChanged(int)),this, SLOT(on_horizontalSlider_valueChanged(int)));
}
三 QScrollBar组件
- 通过滑动条控制字体的大小的改变
- 知识点:当前也是不需要手动关联信号与槽的案例,自动通过槽函数名
on_horizontalScrollBar_valueChanged
完成了关联
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_horizontalScrollBar_valueChanged(int value);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
void Dialog::on_horizontalScrollBar_valueChanged(int value)
{
//选择所有文本
ui->textEdit->selectAll();
//根据滑动条的滚动来增加或减小字体大小
ui->textEdit->setFontPointSize(value);
}
四 QDial表盘控件
- 表盘
- 进度条
void Dialog::on_dial_valueChanged(int value)
{
控制标签上的显示
ui->label->setText(QString::asprintf("%d kM/H",value));
控制进度条的显示
ui->progressBar->setValue(value);
}
五 LCD显示
void Dialog::on_dial_valueChanged(int value)
{
ui->lcdNumber->display(value);
}
void Dialog::on_radioButton2_clicked()
{
控制LED组件显示的位数
ui->lcdNumber->setDigitCount(8);
控制LCD组件显示数字的进制
ui->lcdNumber->setMode(QLCDNumber::Bin);
}
六 QTime 时间
6.1 时间
//创建时间
QTime time1(23,59,59,599);
qDebug() << time1;
//获取当前时间
QTime time2 = QTime::currentTime();
qDebug() << time2;
//时间的计算
int hour = time2.hour();
int minite = time2.minute();
int s = time2.second();
int ms = time2.msec();
qDebug() << hour << ":" << minite << ":" << s << ":" << ms;
QTime time3 =time2.addSecs(850);
qDebug() <<time3;
//计算时间间隔
QTime time4(23,30,00);
int num = time2.secsTo(time4); //time2+ = time4
qDebug() <<time4;
//字符串转时间
QTime time5 = QTime::fromString("23:58:59");
qDebug() <<time5;
QString str = "19点48分";
QTime time6 = QTime::fromString(str,"H点m分");
qDebug() <<time6;
str = "6:08:9";
QTime time7 = QTime::fromString(str,"h:mm:s");
qDebug() <<time7;
//时间转字符串
QTime time8 = QTime::currentTime();
str = time8.toString();
qDebug() <<str;
6.2 日期
//设置日期
QDate date(2024,2,28);
//获取当前日期
QDate data2 = QDate::currentDate();
qDebug() << date;
int year = data2.year();
int month = data2.month();
int day = data2.day();
qDebug() << data2.dayOfYear(); //这一年的第几天
qDebug() << data2.dayOfWeek(); //这一周的第几天
qDebug() << data2.weekNumber();
qDebug() <<data2.isValid();
QDate data3 = data2.addDays(100);
int num = data2.daysTo(data3); data2+? = data3;
//字符串转日期
QString str = "2024年2月23日";
QDate date= QDate::fromString(str,"yyyy-M-dd");
qDebug() << date;
//日期转字符串
QDate date2 = QDate::currentDate();
str = date2.toString();
qDebug() << str;
QDateTime datatime2;
datatime2.setDate(date);
QTime time(20,53);
datatime2.setTime(time);
QDateTime dataTime3 = QDateTime::currentDateTime();
qDebug() << dataTime3;
6.3 QTime, QDate, QDtateTime
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_pushButton_clicked();
void on_spinBoxContinue_valueChanged(int arg1);
void on_pushButtonData_clicked();
void on_spinBoxContinueData_valueChanged(int arg1);
void on_pushButtonDataTime_clicked();
void on_spinBoxContinueDataTime_valueChanged(int arg1);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QTime>
#include <QDebug>
#include <QDate>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
ui->timeEditBegin->setTime(QTime::currentTime());
}
void Dialog::on_spinBoxContinue_valueChanged(int arg1)
{
QTime time = ui->timeEditBegin->time();
QTime time2 = time.addSecs(arg1*3600);
ui->timeEditEnd->setTime(time2);
}
void Dialog::on_pushButtonData_clicked()
{
ui->dateEditStart->setDate(QDate::currentDate());
}
void Dialog::on_spinBoxContinueData_valueChanged(int arg1)
{
QDate date = ui->dateEditStart->date();
QDate date2 = date.addDays(arg1);
ui->dateEditEnd->setDate(date2);
}
void Dialog::on_pushButtonDataTime_clicked()
{
ui->dateEditStartDaretime->setDateTime(QDateTime::currentDateTime());
}
void Dialog::on_spinBoxContinueDataTime_valueChanged(int arg1)
{
QDateTime date = ui->dateEditStartDaretime->dateTime();
QDateTime date2 = date.addDays(arg1);
ui->dateEditEndDatetime->setDateTime(date2);
}
七 QListWidget 时间
- 该组件的作用
- 对应组件在软件中的名字
- 案例
- 知识点1:如何实现鼠标右键单击,显示红色圈所示的选项:首先在界面初始化函数,当前是initUI()函数实现中,添加代码
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
然后在设计界面,点击如下红色圈圈出的空白处,转到槽,选择如下所示槽函数,在槽函数中实现如下代码
QMenu *menu = new QMenu(this);
menu->addAction(ui->actionMode);
menu->addSeparator(); //添加分割线
menu->addAction(ui->actionList);
menu->addAction(ui->actionDelete);
menu->addAction(ui->actionSeleteAll);
menu->addAction(ui->actionSeleteRverse);
menu->exec(QCursor::pos()); //执行
delete menu;
- 知识点2: 使得listWidget里面的图标能够自适应大小,实现换行,在
initUI()
函数中,添加ui->listWidget->setResizeMode(QListView::Adjust);
- 知识点3:这一行使得图标前面有复选框
// item->setCheckState(Qt::Unchecked);
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_actionMode_triggered();
void on_actionList_triggered();
void on_pushButton_clicked();
void on_actionDelete_triggered();
void on_actionSeleteAll_triggered();
void on_actionSeleteRverse_triggered();
void on_listWidget_customContextMenuRequested(const QPoint &pos);
private:
Ui::MainWindow *ui;
void initUI();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initUI();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initUI()
{
//向listWidget中添加item
ui->listWidget->clear();
QStringList itemName = {"C语言", "C++","QT","java","matlab"};
QIcon icon;
icon.addFile(":/images/class.png");
// if (icon.isNull()) {
// // 图标加载失败,路径可能无效
// qDebug() << "Failed to load icon: invalid path or file format.";
// } else {
// qDebug() << "图标加载成功" ;
// }
//设置文字大小
QFont font = ui->listWidget->font();
font.setPixelSize(30);
ui->listWidget->setFont(font);
//设置图标大小
ui->listWidget->setIconSize(QSize(30,30));
//使得listWidget里面的图标能够自适应大小,实现换行
ui->listWidget->setResizeMode(QListView::Adjust);
for(int i = 0; i < itemName.count(); i++){
QListWidgetItem *item = new QListWidgetItem();
item->setText(itemName[i]);
//这一行使得图标前面有复选框
item->setCheckState(Qt::Unchecked);
item->setIcon(icon);
ui->listWidget->addItem(item);
}
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
}
void MainWindow::on_actionMode_triggered()
{
ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setSpacing(30);
}
void MainWindow::on_actionList_triggered()
{
// qDebug() << "函数调用";
ui->listWidget->setViewMode(QListView::ListMode);
ui->listWidget->setSpacing(10);
}
void MainWindow::on_pushButton_clicked()
{
if(ui->lineEdit->text().trimmed().length() >0){
auto item = new QListWidgetItem();
item->setText(ui->lineEdit->text().trimmed());
QIcon icon;
icon.addFile(":/images/class.png");
item->setIcon(icon);
item->setCheckState(Qt::Unchecked);
ui->listWidget->addItem(item);
}
}
void MainWindow::on_actionDelete_triggered()
{
int count = ui->listWidget->count();
for(int i = count-1; i >=0 ; i--)
{
if(ui->listWidget->item(i)->checkState() == Qt::Checked){
auto item = ui->listWidget->takeItem(i);
delete item;
}
}
}
void MainWindow::on_actionSeleteAll_triggered()
{
int count = ui->listWidget->count();
for(int i = count-1; i >=0 ; i--)
{
ui->listWidget->item(i)->setCheckState(Qt::Checked);
}
}
void MainWindow::on_actionSeleteRverse_triggered()
{
int count = ui->listWidget->count();
for(int i = count-1; i >=0 ; i--)
{
if(ui->listWidget->item(i)->checkState() == Qt::Checked){
ui->listWidget->item(i)->setCheckState(Qt::Unchecked);
}else
{
ui->listWidget->item(i)->setCheckState(Qt::Checked);
}
}
}
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
QMenu *menu = new QMenu(this);
menu->addAction(ui->actionMode);
menu->addSeparator(); //添加分割线
menu->addAction(ui->actionList);
menu->addAction(ui->actionDelete);
menu->addAction(ui->actionSeleteAll);
menu->addAction(ui->actionSeleteRverse);
menu->exec(QCursor::pos()); //执行
delete menu;
}
效果:
八 QToolbar
- 功能演示:在七的基础上,添加如下功能
- 对应代码:添加相应的tool button之后, 在
initUI()
函数中直接添加如下代码
//使用QToolButton 设置按钮菜单
QMenu *menu = new QMenu(this);
menu->addAction(ui->actionMode);
menu->addAction(ui->actionList);
menu->addAction(ui->actionDelete);
menu->addAction(ui->actionSeleteAll);
menu->addAction(ui->actionSeleteRverse);
ui->toolButton->setPopupMode(QToolButton::InstantPopup); //按下按钮立刻反馈
ui->toolButton->setDefaultAction(ui->actionMode); //设置默认是什么选项
ui->toolButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
ui->toolButton->setMenu(menu);
九. 如何添加资源文件到Qt程序,例如如何将图片库导入QT程序
出现如下界面
- 点击如下add Prefix,修改前缀如下
- 点击add files ,全选要用的图片,导入
- 选中自己的左侧的图片文件,当前案例是images.qrc,然后邮件,选择
open with
->资源管理器-> save all,就可以在左侧的文件下看到所有图片
十 如何用action快捷的创建菜单栏
-
进入设计模式,点击红色箭头所指位置添加action,然后回出现一个弹框,在弹框内进行相应的内容编辑,选择红色箭头所指位置,进行图标选择,确定之后,依次添加完如下所示的action,可编辑框的左上角的“编辑”是手动输入的,然后将菜单栏中的相应的按钮拖入该选项中即可
-
如何在菜单栏下添加相应的图标,点击右侧的主窗口->添加工具栏,右侧会生成toolbar按钮,左侧编辑框上方会产生一条线,此时可以直接将action拖入线中,生成图标
-
选中toolbar,可以对图标显示进行编辑,选择文字在图片下方
十一 如何自定义界面类
-
欲实现如下功能,QT默认的图片显示是,图片+文字描述,现在希望实现多一行的文字描述
-
先正常创建一个QT项目,然后再执行如下操作,创建一个QT设计师面类
-
设计类创建完毕后,选中新生成的ui界面,进行界面设计
-
在.h文件中,添加函数接口
-
.cpp中完成类的实现,而不是转到槽做实现
-
效果
-
myqqinfo.h
#ifndef MYQQINFO_H
#define MYQQINFO_H
#include <QWidget>
namespace Ui {
class MyQQinfo;
}
class MyQQinfo : public QWidget
{
Q_OBJECT
public:
explicit MyQQinfo(QWidget *parent = nullptr);
~MyQQinfo();
void setHeadImage(QString imgFile);
void setNickName(QString name);
void setInfo(QString info);
private:
Ui::MyQQinfo *ui;
};
#endif // MYQQINFO_H
myqqinfo.cpp
#include "myqqinfo.h"
#include "ui_myqqinfo.h"
#include <QPixmap>
MyQQinfo::MyQQinfo(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyQQinfo)
{
ui->setupUi(this);
}
MyQQinfo::~MyQQinfo()
{
delete ui;
}
void MyQQinfo::setHeadImage(QString imgFile)
{
ui->labelHead->setPixmap(QPixmap(imgFile).scaled(120,120));
}
void MyQQinfo::setNickName(QString name)
{
ui->labelNick->setText(name);
}
void MyQQinfo::setInfo(QString info)
{
ui->labelInfo->setText(info);
}
mainwindow.cpp
,余下文件没有做修改
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myqqinfo.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyQQinfo *info = new MyQQinfo(this);
info->setHeadImage(":/images/song.png");
info->setInfo("好好学习,天天向上");
info->setNickName("Rook");
info->setGeometry(10,10,400,120);
info = new MyQQinfo(this);
info->setHeadImage(":/images/tang.png");
info->setInfo("good good");
info->setNickName("Jack");
info->setGeometry(10,150,400,120);
}
MainWindow::~MainWindow()
{
delete ui;
}
- 如何调用自定义界面,见十二
十二 QToolBox
- 知识点:如何调用自定义界面,当前案例是在QListWidget组件中调用自定义界面。可以总结为,直接在Qt项目中创建一个新的设计师类,在类中进行界面的设计,然后当成常规组件进行调用
for(int i = 0; i <10; i++){
QListWidgetItem *item = new QListWidgetItem();
// item->setText("好友"+QString::number(i+1));
// item->setIcon(icon);
item->setSizeHint(QSize(600,120));
listwidget->addItem(item);
MyQQinfo *info = new MyQQinfo(this);
info->setHeadImage(":/images/song.png");
info->setInfo("好好学习,天天向上");
info->setNickName("好友"+QString::number(i+1));
listwidget->setItemWidget(item,info);
}
- 实现效果
-
当前案例将 十一 案例中的文件直接添加到了当前文件中进行调用
-
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QListWidget>
#include <QDebug>
#include "myqqinfo.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
initUI();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::initUI()
{
//移除设计器中toolBox成员
for(int i = ui->toolBox->count()-1; i >=0; i--){
ui->toolBox->removeItem(i);
}
//添加好友分组
//QListWidget list模式
QListWidget *listwidget = new QListWidget();
listwidget->setIconSize(QSize(48,48));
QIcon icon;
icon.addFile(":/images/song.png");
for(int i = 0; i <10; i++){
QListWidgetItem *item = new QListWidgetItem();
// item->setText("好友"+QString::number(i+1));
// item->setIcon(icon);
item->setSizeHint(QSize(600,120));
listwidget->addItem(item);
MyQQinfo *info = new MyQQinfo(this);
info->setHeadImage(":/images/song.png");
info->setInfo("好好学习,天天向上");
info->setNickName("好友"+QString::number(i+1));
listwidget->setItemWidget(item,info);
}
ui->toolBox->addItem(listwidget,"我的好友");
listwidget = new QListWidget();
listwidget->setIconSize(QSize(48,48));
for(int i = 0; i <10; i++){
QListWidgetItem *item = new QListWidgetItem();
item->setText("同学"+QString::number(i+1));
item->setIcon(icon);
item->setSizeHint(QSize(200,60));
listwidget->addItem(item);
}
ui->toolBox->addItem(listwidget,"我的同学");
listwidget = new QListWidget();
listwidget->setIconSize(QSize(48,48));
for(int i = 0; i <10; i++){
QListWidgetItem *item = new QListWidgetItem();
item->setText("黑名单"+QString::number(i+1));
item->setIcon(icon);
item->setSizeHint(QSize(200,60));
listwidget->addItem(item);
}
ui->toolBox->addItem(listwidget,"黑名单");
}
十三 QSpliter
- 分割按钮如下所示
-
使用水平分割之后的效果如下
-
但是没有居中,在Qt构造函数中添加一行代码,
setCentralWidget(ui->splitter);
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->splitter);
}
十四 QPlainTextEidt 和 QTextEdidt
QPlainTextEidt
类似于记事本,纯文本编辑,QTextEdidt
可以插入图片
//打开一个文件选择器
QString filename = QFileDialog::getOpenFileName(this,"选择本地图片");
QString str = QString::asprintf("<img src=%s>", filename.toStdString().c_str());
ui->textEdit->insertHtml(str);