QT编程记录补充
目录
开始写博客的时候是今年的1月份,从这本书中第5章节开始写的,有些前边的记录,当初只是当成笔记来写,有些学习QT同学想了解前边的工程第一到第四章内容,下面我这里简单的说明一下,对应的工程我会发链接,大家下载就可以了。
第一章:
第一章讲述了认识QT知识,界面布局等等,认识Qt Creator编译器,如何去操作这个IDE,这里就不再过多去讲了,可以查看书籍,同时老生常谈的第一个编辑程序:
hello world !
例子连接:hello World例子 提取码:zs4z
第二章:
第二章讲述了GUI 应用程序设计墓础:
2.1小结讲述了基本的QT文件,对应的头文件,cpp文件,以及主函数部分内容,这部分书上讲解的非常详细,这里没有必要去详细讲解,不了解可以看书,或者找一些视频看看。
2.2为可视化 UI 设计,第一个例子为:
这里只是讲解了如何布局,与使用的工具,都是刚刚入门要了解的东西,复选框,单选框,按钮,文本框等等基本操作。
对应头文件:
#ifndef QWDIALOG_H
#define QWDIALOG_H
#include <QDialog>
namespace Ui {
class QWDialog;
}
class QWDialog : public QDialog
{
Q_OBJECT //只要使用信号与槽功能的类,都需加入此宏定义
public:
explicit QWDialog(QWidget *parent = 0); //构造函数
~QWDialog(); //析构函数
private slots:
void on_chkBoxUnder_clicked(bool checked); //设置下划线
void on_chkBoxItalic_clicked(bool checked); //设置斜体
void on_chkBoxBold_clicked(bool checked); //设置粗体
void setTextFontColor(); //设置字体颜色
private:
Ui::QWDialog *ui; //指向界面的指针,用于访问界面组件
};
#endif // QWDIALOG_H
对应cpp文件:
#include "qwdialog.h"
#include "ui_qwdialog.h"
QWDialog::QWDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialog)
{
ui->setupUi(this); //UI初始化
connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//信号与槽的关联
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//信号与槽的关联
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//信号与槽的关联
}
QWDialog::~QWDialog()
{
delete ui;
}
void QWDialog::setTextFontColor()
{ //设置字体颜色
QPalette plet=ui->txtEdit->palette();
if (ui->rBtnBlue->isChecked())
plet.setColor(QPalette::Text,Qt::blue);
else if (ui->rBtnRed->isChecked())
plet.setColor(QPalette::Text,Qt::red);
else if (ui->rBtnBlack->isChecked())
plet.setColor(QPalette::Text,Qt::black);
else
plet.setColor(QPalette::Text,Qt::black);
ui->txtEdit->setPalette(plet);
}
void QWDialog::on_chkBoxUnder_clicked(bool checked)
{//设置下划线
QFont font=ui->txtEdit->font();
font.setUnderline(checked);
ui->txtEdit->setFont(font);
}
void QWDialog::on_chkBoxItalic_clicked(bool checked)
{ //设置斜体
QFont font=ui->txtEdit->font();
font.setItalic(checked);
ui->txtEdit->setFont(font);
}
void QWDialog::on_chkBoxBold_clicked(bool checked)
{ //设置粗体
QFont font=ui->txtEdit->font();
font.setBold(checked);
ui->txtEdit->setFont(font);
}
例子连接:例子链接 提取码:1ope
2.3讲述了代码的设计:
不使用ui布局的方式画图,用纯代码的方式来实现上述例子的功能,下面我们看看吧。
#ifndef QWDLGMANUAL_H
#define QWDLGMANUAL_H
#include <QDialog>
#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>
class QWDlgManual : public QDialog
{
Q_OBJECT
private:
QCheckBox *chkBoxUnder;
QCheckBox *chkBoxItalic;
QCheckBox *chkBoxBold;
QRadioButton *rBtnBlack;
QRadioButton *rBtnRed;
QRadioButton *rBtnBlue;
QPlainTextEdit *txtEdit;
QPushButton *btnOK;
QPushButton *btnCancel;
QPushButton *btnClose;
void iniUI();//UI 创建与初始化
void iniSignalSlots();//初始化信号与槽的链接
private slots:
void on_chkBoxUnder(bool checked); //Underline 的clicked(bool)信号的槽函数
void on_chkBoxItalic(bool checked);//Italic 的clicked(bool)信号的槽函数
void on_chkBoxBold(bool checked); //Bold 的clicked(bool)信号的槽函数
void setTextFontColor(); //设置字体颜色
public:
QWDlgManual(QWidget *parent = 0);
~QWDlgManual();
};
#endif // QWDLGMANUAL_H
对应的cpp文件:
#include "qwdlgmanual.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
void QWDlgManual::iniUI()
{
//创建 Underline, Italic, Bold三个CheckBox,并水平布局
chkBoxUnder=new QCheckBox(tr("Underline"));
chkBoxItalic=new QCheckBox(tr("Italic"));
chkBoxBold=new QCheckBox(tr("Bold"));
QHBoxLayout *HLay1=new QHBoxLayout;
HLay1->addWidget(chkBoxUnder);
HLay1->addWidget(chkBoxItalic);
HLay1->addWidget(chkBoxBold);
//创建 Black, Red, Blue三个RadioButton,并水平布局
rBtnBlack=new QRadioButton(tr("Black"));
rBtnBlack->setChecked(true);//缺省被选中
rBtnRed=new QRadioButton(tr("Red"));
rBtnBlue=new QRadioButton(tr("Blue"));
QHBoxLayout *HLay2=new QHBoxLayout;
HLay2->addWidget(rBtnBlack);
HLay2->addWidget(rBtnRed);
HLay2->addWidget(rBtnBlue);
//创建 确定, 取消, 退出 三个 QPushButton, 并水平布局
btnOK=new QPushButton(tr("确定"));
btnCancel=new QPushButton(tr("取消"));
btnClose=new QPushButton(tr("退出"));
QHBoxLayout *HLay3=new QHBoxLayout;
HLay3->addStretch();
HLay3->addWidget(btnOK);
HLay3->addWidget(btnCancel);
HLay3->addStretch();
HLay3->addWidget(btnClose);
//创建 文本框,并设置初始字体
txtEdit=new QPlainTextEdit;
txtEdit->setPlainText("Hello world\n\nIt is my demo");
QFont font=txtEdit->font(); //获取字体
font.setPointSize(20);//修改字体大小为20
txtEdit->setFont(font);//设置字体
//创建 垂直布局,并设置为主布局
QVBoxLayout *VLay=new QVBoxLayout;
VLay->addLayout(HLay1); //添加字体类型组
VLay->addLayout(HLay2);//添加字体颜色组
VLay->addWidget(txtEdit);//添加PlainTextEdit
VLay->addLayout(HLay3);//添加按键组
setLayout(VLay); //设置为窗体的主布局
}
void QWDlgManual::iniSignalSlots()
{
//三个颜色 QRadioButton的clicked()事件与setTextFontColor()槽函数关联
connect(rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
//三个字体设置的 QCheckBox 的clicked(bool)事件与 相应的槽函数关联
connect(chkBoxUnder,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxUnder(bool)));//
connect(chkBoxItalic,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxItalic(bool)));//
connect(chkBoxBold,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxBold(bool)));//
//三个按键与窗体的槽函数关联
connect(btnOK,SIGNAL(clicked()),this,SLOT(accept()));//
connect(btnCancel,SIGNAL(clicked()),this,SLOT(reject()));//
connect(btnClose,SIGNAL(clicked()),this,SLOT(close()));//
}
void QWDlgManual::on_chkBoxUnder(bool checked)
{
QFont font=txtEdit->font();
font.setUnderline(checked);
txtEdit->setFont(font);
}
void QWDlgManual::on_chkBoxItalic(bool checked)
{
QFont font=txtEdit->font();
font.setItalic(checked);
txtEdit->setFont(font);
}
void QWDlgManual::on_chkBoxBold(bool checked)
{
QFont font=txtEdit->font();
font.setBold(checked);
txtEdit->setFont(font);
}
void QWDlgManual::setTextFontColor()
{
QPalette plet=txtEdit->palette();
if (rBtnBlue->isChecked())
plet.setColor(QPalette::Text,Qt::blue);
else if (rBtnRed->isChecked())
plet.setColor(QPalette::Text,Qt::red);
else if (rBtnBlack->isChecked())
plet.setColor(QPalette::Text,Qt::black);
else
plet.setColor(QPalette::Text,Qt::black);
txtEdit->setPalette(plet);
}
QWDlgManual::QWDlgManual(QWidget *parent)
: QDialog(parent)
{
iniUI(); //界面创建与布局
iniSignalSlots(); //信号与槽的关联
setWindowTitle("Form created manually");//设置窗体标题
}
QWDlgManual::~QWDlgManual()
{
}
发现使用纯代码去写程序会比较复杂,拖控件的方式,使开发率更高,其实拖出来的控件,在对应的文件中,会写出对应的代码。喜欢那种方式看你自己,拖的不香么。
2.4讲解了 混合方式 UI 设计
主要讲述了工具栏,菜单的设计
例子连接:本例子 提取码:02te
对应界面布局:
对应的槽函数:
对应的头文件:
#ifndef QWMAINWIND_H
#define QWMAINWIND_H
#include <QMainWindow>
#include <QLabel>
#include <QProgressBar>
#include <QSpinBox>
#include <QFontComboBox>
namespace Ui {
class QWMainWind;
}
class QWMainWind : public QMainWindow
{
Q_OBJECT
private:
QString fCurFileName;//当前文件名
QLabel *fLabCurFile;//状态栏里显示当前文件的Label
QProgressBar *progressBar1;//状态栏上的进度条
QSpinBox *spinFontSize;// 字体大写
QFontComboBox *comboFont;//字体名称
void updateCurFile(QString aFile);//更新当前文件名,并更新状态栏提示
void iniUI(); //程序设计的UI初始化
void iniSignalSlots(); //手工关联信号与槽
void createNew();
public:
explicit QWMainWind(QWidget *parent = 0);
~QWMainWind();
private slots:
//UI界面设计生成的槽函数
void on_actFontBold_triggered(bool checked); //粗体Action
void on_actFontItalic_triggered(bool checked); //斜体Action
void on_actFontUnder_triggered(bool checked); //下划线Action
void on_actNew_triggered();//新建文件
void on_actOpen_triggered();//打开文件
void on_actFont_triggered();//字体选择对话框
// void on_txtEdit_cursorPositionChanged();//txtEdit的光标位置发生变化
void on_txtEdit_selectionChanged(); //当前选择的文字发生变化,更新粗体、斜体、下划线3个action的checked状态
void on_txtEdit_copyAvailable(bool b);//有文字可copy时更新cut,copy的Enable状态
void on_actToolbarLab_triggered(bool checked); //设置工具栏按钮样式
// 自定义槽函数
void on_spinBoxFontSize_valueChanged(int aFontSize);//改变字体大小的SpinBox的响应
void on_comboFont_currentIndexChanged(const QString &arg1);//FontCombobox的响应,选择字体名称
private:
Ui::QWMainWind *ui;
};
#endif // QWMAINWIND_H
对应cpp:
#include "qwmainwind.h"
#include "ui_qwmainwind.h"
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QFontDialog>
#include <QCoreApplication>
#include <Qlabel>
#include <QTextCharFormat>
void QWMainWind::updateCurFile(QString aFile)
{//更新当前文件名,并更新状态栏提示
fCurFileName=aFile;
fLabCurFile->setText("当前文件:"+fCurFileName);
}
void QWMainWind::iniUI()
{
//状态栏
fLabCurFile=new QLabel; //用于显示当前文件名的标签
fLabCurFile->setMinimumWidth(150);
fLabCurFile->setText("当前文件:");
ui->statusBar->addWidget(fLabCurFile);//添加到状态栏
progressBar1=new QProgressBar;//状态栏上的进度条
progressBar1->setMaximumWidth(200);//设置组件最大宽度
progressBar1->setMinimum(5);
progressBar1->setMaximum(50);
progressBar1->setValue(ui->txtEdit->font().pointSize());//初始值
ui->statusBar->addWidget(progressBar1); //添加到状态栏
//工具栏
spinFontSize = new QSpinBox;// 工具栏上的文字大小 SpinBox
spinFontSize->setMinimum(5);
spinFontSize->setMaximum(50);
spinFontSize->setValue(ui->txtEdit->font().pointSize());//初始值
spinFontSize->setMinimumWidth(50);//设置组件最小宽度
ui->mainToolBar->addWidget(new QLabel("字体大小 ")); //不引用的Label无需定义变量
ui->mainToolBar->addWidget(spinFontSize); //SpinBox添加到工具栏
ui->mainToolBar->addSeparator(); //工具栏上增加分隔条
ui->mainToolBar->addWidget(new QLabel(" 字体 "));
comboFont = new QFontComboBox;//字体名称ComboBox
comboFont->setMinimumWidth(150); //设置组件最小宽度
ui->mainToolBar->addWidget(comboFont);//添加到工具栏
//
setCentralWidget(ui->txtEdit); //将txtEdit设置为中心组件,自动填充整个工作区
}
void QWMainWind::iniSignalSlots()
{ //信号与槽的关联,当函数带有参数时,必须写明参数的类型
connect(spinFontSize,SIGNAL(valueChanged(int)),
this,SLOT(on_spinBoxFontSize_valueChanged(int)));
connect(comboFont,SIGNAL(currentIndexChanged(const QString &)),
this,SLOT(on_comboFont_currentIndexChanged(const QString &)));
}
QWMainWind::QWMainWind(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QWMainWind)
{
ui->setupUi(this);
iniUI();//手工初始化UI
iniSignalSlots();//信号与槽关联
}
QWMainWind::~QWMainWind()
{
delete ui;
}
void QWMainWind::on_txtEdit_copyAvailable(bool b)
{//有文字可copy时更新cut,copy的Enable状态
ui->actCut->setEnabled(b); //能否 cut
ui->actCopy->setEnabled(b); //能否copy
ui->actPaste->setEnabled(ui->txtEdit->canPaste()); //能否paste
}
void QWMainWind::on_actOpen_triggered()
{
QString curPath,aFileName;
curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//调用打开文件对话框打开一个文件
aFileName=QFileDialog::getOpenFileName(this,tr("打开一个文件"),curPath,
"C++程序文件(*.cpp);;H头文件(*.h);;文本文件(*.txt);;所有文件(*.*)");
if (!aFileName.isEmpty())
{
QFile aFile(aFileName); //以文件方式读出
if (aFile.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream aStream(&aFile); //用文本流读取文件
while (!aStream.atEnd())
ui->txtEdit->append(aStream.readLine()); //读取一个文本行
updateCurFile(aFileName); //更新状态栏显示
}
aFile.close();
}
}
void QWMainWind::on_actFont_triggered()
{
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok)
ui->txtEdit->setFont(font);
}
void QWMainWind::on_actNew_triggered()
{//新建文件
ui->txtEdit->clear();
updateCurFile("");
}
void QWMainWind::on_spinBoxFontSize_valueChanged(int aFontSize)
{//改变字体大小的SpinBox的响应
QTextCharFormat fmt;
fmt.setFontPointSize(aFontSize); //设置字体大小
ui->txtEdit->mergeCurrentCharFormat(fmt);
progressBar1->setValue(aFontSize);
}
void QWMainWind::on_comboFont_currentIndexChanged(const QString &arg1)
{//FontCombobox的响应,选择字体名称
QTextCharFormat fmt;
fmt.setFontFamily(arg1);//设置字体名称
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void QWMainWind::on_actToolbarLab_triggered(bool checked)
{
if (checked) //显示文字和图标
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
else //只显示图标
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
}
void QWMainWind::on_actFontBold_triggered(bool checked)
{
QTextCharFormat fmt; //格式
fmt=ui->txtEdit->currentCharFormat();//获取当前选择文字的格式
if (checked) // 相当于调用ui->actFontBold->isChecked();读取Action的check状态
fmt.setFontWeight(QFont::Bold);
else
fmt.setFontWeight(QFont::Normal);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void QWMainWind::on_actFontItalic_triggered(bool checked)
{
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat();
fmt.setFontItalic(checked);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void QWMainWind::on_actFontUnder_triggered(bool checked)
{
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat();
fmt.setFontUnderline(checked);
ui->txtEdit->mergeCurrentCharFormat(fmt);
}
void QWMainWind::on_txtEdit_selectionChanged()
{//当前选择的文字发生变化,更新粗体、斜体、下划线3个action的checked状态
QTextCharFormat fmt;
fmt=ui->txtEdit->currentCharFormat(); //获取文字的格式
ui->actFontItalic->setChecked(fmt.fontItalic()); //是否斜体
ui->actFontBold->setChecked(fmt.font().bold()); //是否粗体
ui->actFontUnder->setChecked(fmt.fontUnderline()); //是否有下划线
}
今天先记录到这里,这是前两章的内容,喜欢的点个赞,关注我,会有很多干货等着你。