主要是总结学习开发过程中遇到的一些知识点,方便复习.
全局定义
- 在<QtGlobal>文件中, 包含了Qt类库中的一些全局定义,包括基本数据类型,函数和宏
基本数据类型
qt的基本数据类型存在的目的就是为了保证各个平台中的数据长度保持一致
其中qfloat16,需要包含头文件QFloat16,就是16位浮点数
Qt数据类型 | 等效定义 | 字节数 |
qint8 | signed char | 1 |
qint16 | signed short | 2 |
qint32 | signed int | 4 |
qint64 | long long int | 8 |
qlong | long long int | 8 |
quint8 | unsigned char | 1 |
quint16 | unsignedshort | 2 |
quint32 | unsigned int | 4 |
quint64 | unsigned long long int | 8 |
qulonglong | unsigned long long int | 8 |
uchar | unsigned char | 1 |
ushort | unsigned short | 2 |
uint | unsigned int | 4 |
ulong | unsigned long | 8 |
qreal | double | 8 |
qfloat16 | 2 |
容器类
Qt提供了很多容器类(基于模板的), 这样可以很方便的存储指定类型的数据项
每种容器类都有其处理对应数据项的基本方法,掌握容器类分类及其使用方法是本节的要点.
顺序容器类
顾名思义,顺序容器类就是按照一定的逻辑顺序存储数据项.
- QList容器类
- 实现方式:数组列表
- 索引方式:数组下标, at()函数
- 特点:速度快,适用面广
- 常用函数:
- QList::insert()
- QList::replace()
- QList::removeAt()
- QList::move()
- QList::append()
- QList::prepend()
- QList::isEmpty()
- QList::at()
- 子类:
- QStringList,更快速的存储字符串列表类数据
- 方法.count()获得字符串文本行数
- QStringList,更快速的存储字符串列表类数据
- QLinkedList容器类
- 实现方式:链式列表(内存不是连续的)
- 索引方式:at()函数
- 常用函数:参考QList类
- QStack容器类
- 堆栈的后入先出LIFO,常用函数push()和pop()
- QQueue容器类
- 队列FIFO,enqueue()和dequeue()
关联容器类
关联容器类就是按照一定的关联逻辑存储数据项.
简单介绍:
QSet是数据项顺序不定的基于散列表的集合模板类
QMap<Key,T>提供一个字典(关联数组),一个键映射一个值,按键的顺序存储,使用insert()赋值,remove()移除,下标或value()索引
容器类的迭代
元对象
- 元对象系统组成
- QObject类是所有元对象系统的类的基类
- 在类的private中声明Q_OBJECT宏,就可以使用元对象的特性,如动态属性,信号和槽
- MOC元对象编译器,构建项目时,MOC工具会自动读取C++源文件,如果发现Q_OBJECT宏就会为该类自动生成另一个包含元对象支持代码的C++源文件,且会将两个源文件和实现文件一起编译连接(了解即可)
- 元对象的基本功能
-
QObject::setProperty() QObject::property() //分别是设置属性和访问属性 QObject::metaObject() /* QObject::metaObject()函数返回 类关联的 元对象,其类型是QMetaObject类; 当然:在类private中使用宏定义Q_OBJECT 使得该类可以用元对象特性 元对象类QMetaObject类包含了元对象的一些接口: QmetaObject::className()方法在运行时返回相关类的名称字符串 QMetaObject::propertyCount() 返回类的属性的个数 QMetaClassInfo QMetaObject::classInfo(int index) const 获取元对象的附加信息,返回的是QMetaClassInfo类型(见下文:附加了信息) */ //举例 const QMetaObject *meta = boy->metaObject(); cout<<meta->className()<<endl; cout<<meta->propertyCount()<<endl; //附加类信息 //定义 Q_CLASSINFO //关键字用来定义附加类信息 //获取 QMetaClassInfo QMetaObject::classInfo(int index) const //元对象可使用接口函数classInfo()获得对应的附加信息,返回的类型是 QMetaClassInfo类 QMetaClassInfo::name() QMetaClassInfo::value() //该类封装了两个接口, name()和value()分别获取附加信息的名称和值 //举例 const QMetaObject *meta = boy->metaObject(); QMetaClassInfo qMCI = meta->classInfo(2); //取第2个附加类信息 cout<<qMCI.name()<<endl; cout<<qMCI.value()<<endl;
-
- 属性系统
- 属性系统包括了属性的定义和使用,以及动态属性和附加信息的设置和使用
//属性定义 Q_PROPERTY(type name(READ getFunction [WRITE setFunction] | MEMBER memberName [ (READ getFucntion | WRITE setFunction) ] ) [RESET resetFunction] [NOTIFY notifySignal] [REVISION int] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL] ) //解释 Q_PROPERTY(type name(READ getFunction [WRITE setFunction] | MEMBER memberName [ (READ getFucntion | WRITE setFunction) ] ) //定义1个返回类型是type的,名称是name的属性, //且用READ和WRITE关键字,关联该属性的写入,读取函数 // 使用READ指定一个读取属性的函数 // 使用WRITE指定一个写入属性的函数 // 使用MEMBER指定一个成员变量和属性关联,可以对属性进行读写 // 此时无需READ和WRITE //仅把函数名和属性关联,函数自身仍需要声明和定义(同一般方法一致) //下面关键字分别关联不同的功能,是可选的 [RESET resetFunction] //指定默认属性值的函数 [NOTIFY notifySignal] //指定一个信号,属性值变化时该信号发射 [REVISION int] //版本号 [DESIGNABLE bool] //设置属性能否在QtDesigner中可见 [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] //指定该属性是常数,即不可WRITE和NOTIFY [FINAL] ) //指定该属性无法被子类重载 //属性使用 //知道属性名,就可以使用QObject::setProperty()设置属性和QObject::property()获取属性 QObject *object = button; object->setProperty("name", true) //该属性是名为name,返回类型是bool bool a = object->property("name"); //动态属性 //在运行时定义的新属性,使用方法同上 //附加属性 //利用宏Q_CLASSINFO(),为元对象定义"名称-值"的附加信息 // class QMyClass : public QObject { Q_OBJECT Q_CLASSINFO("author", "sherlock") Q_CLASSINFO("version","0.0.1") public: private: private slots: signals: }; //举例 #ifndef QPERSON_H #define QPERSON_H #include <QObject> class QPerson : public QObject { Q_OBJECT Q_CLASSINFO("author","Wang") Q_CLASSINFO("company","UPC") Q_CLASSINFO("version","1.0.0") Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged) Q_PROPERTY(QString name MEMBER m_name) Q_PROPERTY(int score MEMBER m_score) private: int m_age=10; QString m_name; int m_score=79; public: explicit QPerson(QString fName, QObject *parent = nullptr); int age(); void setAge(int value); void incAge(); signals: void ageChanged( int value); public slots: }; #endif // QPERSON_H
- 属性系统包括了属性的定义和使用,以及动态属性和附加信息的设置和使用
信号与槽
当信号与槽函数的参数数量相同时,参数类型要一致
当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。
//特征标一致
void iSignal(int b);
void MainWindow::iSlot(int b)
{
QString qString;
qDebug()<<qString.number(b);
}
connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int)));
emit iSignal(5);
//output:5
//特征标不一致
void iSignal(int a, float b);
void MainWindow::iSlot(int b)
{
QString qString;
qDebug()<<qString.number(b);
}
connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int)));
emit iSignal(5, 0.3);
//output:5
- 设计一个槽函数,可以实现三个按钮实现的效果互斥
-
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); }
-
- 定义一个信号(信号只定义,无需实现,只需要在某情景下发射该信号即可)
-
#ifndef QPERSON_H #define QPERSON_H #include <QObject> class QPerson : public QObject { Q_OBJECT Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged) //ageChanged信号为自定义信号 private: public: signals: void ageChanged( int value); //自定义信号,注意无需实现代码,只需发射信号即可 public slots: }; #endif // QPERSON_H //发射信号 #include "qperson.h" QPerson::QPerson(QString fName,QObject *parent) : QObject(parent) { //构造函数 m_name=fName; } void QPerson::setAge(int value) {//设置age m_age=value; emit ageChanged(m_age); //发射信号 }
-
- 信号和槽关联的函数
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//一般将关联函数放到类构造函数中
- 自定义槽函数
//一般在类中声明一个私有方法作为槽函数
class QWDlgManual : public QDialog{
Q_OBJECT
private:
QPushButton *btnOK;
QPushButton *btnCancel;
void iniUI();
void iniSignalSlots();
private slots:
void on_chkBoxUnder(bool checked);
void setTextFontColor(bool checked);
public:
QWDlgManual(QWidget *parent = 0);
~QWDLgManual();
};
- 面临无法使用可视化工具添加组件时,需要使用代码来进行添加
- 例如:向工具栏添加一个SpinBox,向状态栏添加进度条等
- 想使用某些挂件装置,需要先将其库文件包含到程序中
//mymainwindow.h
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
//包含需要的文件
#include <QMainWindow>
#include <QLabel>
#include <QProgressBar>
#include <QFontComboBox>
#include <QSpinBox>
QT_BEGIN_NAMESPACE
namespace Ui { class myMainWindow; }
QT_END_NAMESPACE
class myMainWindow : public QMainWindow
{
Q_OBJECT //声明该宏则该类可以使用元对象的特性
public:
myMainWindow(QWidget *parent = nullptr);
~myMainWindow();
private:
Ui::myMainWindow *ui;
QLabel *fLabCurFile;
QProgressBar *progressBar1;
QSpinBox *spinFontSize;
QFontComboBox *comboFont;
void iniUI();
};
#endif // MYMAINWINDOW_H
//mymainwind.cpp
#include "mymainwindow.h"
#include "ui_mymainwindow.h"
myMainWindow::myMainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::myMainWindow)
{
ui->setupUi(this);
iniUI(); //必须要在setupUI()后,因为setupUI()负责构建一个可视化界面
}
myMainWindow::~myMainWindow()
{
delete ui;
}
//使用iniUI()函数来完成部分界面的设置
void myMainWindow::iniUI()
{
//在状态栏上添加自定义组件 ui->statusbar即ui界面的状态栏
fLabCurFile = new QLabel; //创建一个QLabel对象,用来设置状态栏
fLabCurFile->setMinimumWidth(150); //设置该对象的在状态栏的宽度是150
fLabCurFile->setText("当前文件:"); //设置该对象在状态栏的显示内容
ui->statusbar->addWidget(fLabCurFile); //将该对象添加到状态栏
progressBar1 = new QProgressBar;
progressBar1->setMaximumWidth(200);
progressBar1->setMinimum(5);
progressBar1->setMaximum(50);
progressBar1->setValue(ui->actExit->font().pointSize());
ui->statusbar->addWidget(progressBar1);
//在工具栏上添加自定义组件,默认状态下ui界面的一个工具栏叫ui->toolBar
spinFontSize = new QSpinBox;
spinFontSize->setMinimum(5);
spinFontSize->setMaximum(50);
spinFontSize->setValue(ui->textEdit->font().pointSize());
spinFontSize->setMinimumWidth(50);
ui->toolBar->addWidget(new QLabel("字体大小: "));
ui->toolBar->addWidget(spinFontSize);
ui->toolBar->addSeparator(); //添加分割条
ui->toolBar->addWidget(new QLabel(" 字体 "));
comboFont = new QFontComboBox;
comboFont->setMinimumWidth(150);
ui->toolBar->addWidget(comboFont);
setCentralWidget(ui->textEdit);
}
字符串
- QString类
- 主要用于字符串的操作,字符串和数字之间的转换等
- 普通数值和字符串的转换
-
//QString类的类型转换方法实例 //转成整数,浮点数 void Widget::on_btnCal_clicked() { QString str = ui->editNum->text(); //QLabel/QLineEdit类的读取函数 int num = str.toInt(); //字符串类型转换 str = ui->editPrice->text(); //QLabel/QLineEdit类的读取函数 float price = str.toFloat(); //QString转换成float类型 float total = num*price; str = str.sprintf("%.2f", total); ui->editTotal->setText(str); //QLabel/QLineEdit类的显示设置函数 } //不设置参数时,如下函数将默认从十进制字符串转换成整数,否则将指定的进制字符串转换成整数 int toInt(bool *ok = Q_NULLPTR, int base = 10) const; int toLong(bool *ok = Q_NULLPTR, int base = 10) const; int toShort(bool *ok = Q_NULLPTR, int base = 10) const; int toUInt(bool *ok = Q_NULLPTR, int base = 10) const; int toULong(bool *ok = Q_NULLPTR, int base = 10) const; double toDouble(bool *ok = Q_NULLPTR) const; float toFloat(bool *ok = Q_NULLPTR) const;
-
- 字符串打印,和字符串赋值
-
QString str; float total = 2.345678; str = QString::number(total,'f',2); str = QString::asprintf("%.2f",total); str = str.setNum(total,'f',2); str = str.sprintf("%.2f",total);
-
- QString的常用方法(只要QString字符串赋值,就会自动追加'\0')
-
//添加字符.append() 和.prepend()方法 QString str1 = "ab"; QString str2 = "ccc"; str1.append(str2); //末尾追加str2 str2.prepend(str1); //前方追加str1 //大小写 str2 = str1.toUpper(); //字符全部大写 str2 = str1.toLower(); //字符全部小写 //返回字符串字符个数,汉字也算1个字符 int N; N = str1.count(); N = str1.size(); N = str1.length(); //去空格 str2 = str1.trimmed(); //去首尾空格 str2 = str1.simplified(); //去首尾空格,且中间连续空格用1个空格替换 //查找 N = str1.indexOf("5.0"); //查找字符串中5.0出现的位置 int indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)const; //indexOf()const 函数的原型,其中str为对应字符串的引用,from为查找的起点位置,cs为是否指定大小写 N = str1.lastIndexOf("\\"); //查找字符\最后出现的位置,因为\需要转义所以使用\\表示\ //字符串对象判空 bool B; B = str1.isNull(); //NULL表示无,即连'\0'也没有,只有未赋值的字符串此时B才为TRUE B = str1.isEmpty(); //empty表示空,表示仅有'\0' //判断是否包含某字符 N = str1.constains(".cpp",Qt::CaseInsensitive); //N为bool, 且不区分大小写 N = str1.constains("cpppp",Qt::CaseSensitive); //区分大小写 //判断是否以某个字符开头 N = str1.endsWith("a",Qt::CaseInsensitive); //不区分大小写 N = str1.endsWith("a",Qt::CaseSensitive); //区分大小写 N = str1.endsWith("a"); //不区分大小写 //截取字符 QString str3; str3 = str1.left(4); str3 = str2.right(3); //分割提取 QString section(const QString &sep, int start, int end = -1; SectionFlags flags = SectionDefault) const; //将sep作为分隔符,用分割符切割字符串成多个块,且从0开始排序 str3 = "1,2,3,4,a,5,6"; str1 = str3.section(",",0,0); //str1 = "1" str1 = str3.section(",",1,1); //str1 = "2" str1 = str3.section(",",0,2); //str1 = "1,2,3" str1 = str3.section(",",4,6); //str1 = "a,5,6" str1 = str3.section(","6,6); //str1 = "6" QStringList QString::split(const QString &sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const QString str = "a,,b,c"; QStringList list1 = str.split(','); // list1: [ "a", "", "b", "c" ] QStringList list2 = str.split(',', QString::SkipEmptyParts); // list2: [ "a", "b", "c" ] QString str = "abc"; auto parts = str.split(""); // parts: {"", "a", "b", "c", ""} QString str = "/a/b/c/"; auto parts = str.split('/'); // parts: {"", "a", "b", "c", ""}
-
一般属性在类的接口中有读取函数和设置函数,对于设置属性函数就是属性名前加set
如QSpinBox类中有属性value用来显示组件当前值,可以使用setValue()方法来设置该组件的值.
输入组件和显示组件
- 如何创建一个关闭窗口的按钮
- 使用界面组件的方法,在信号与槽编辑器的工具栏上点击"Add"按钮,在出现的条目中,Sender选择目标对象此处是btnClose,Signal选择信号cilicked(),Receiver选择窗体Widget,Slot选择close()
数值输入显示组件SpinBox
- QSpinBox用于整数的显示和输入
- QDougbleSpinBox用于浮点数的显示和输入
- 读取数值类型和设置数据类型不同时,无需转换,Qt会自动转换.
//主要属性参数
//Properties : DataType
cleanText : const QString //清理文本
displayIntegerBase : int //显示整数使用的进制
maximum : int //最大值
minimum : int //最小值
prefix : QString //前缀
singleStep : int //单步值
suffix : QString //后缀
value : int //具体值,显示值
//Public Functions
QString cleanText() const;
QString prefix()const;
int maximum()const;
int minimum()const;
int singleStep()const;
int value()const;
void setMaximum(int max);
void setMinimum(int min);
void setPrefix(const QString &prefix);
void setRange(int minimum, int maximum);
void setSingleStep(int val);
//Public Slots
void setValue(int val);
//Signals
void valueChanged(int i);
void valueChanged(const QString &text);
//example
//samp4_3_myWidget.cpp
void Widget::on_btnCal_clicked()
{
int num = ui->spinBoxNum->value();
float price = ui->spinBoxPrice->value();
float total = num*price;
ui->spinBoxTotal->setValue(total);
}
其他数值输入和显示组件
组件 | 基本属性 | 附加属性 | 设置方法 | 父类 | 基本属性解释 | 附加属性解释 |
QSliser(滑动条) | minimum maximum singleStep pageStep value sliderPosition tracking orientation invertedAppearance invertedControls | tickPosition tickInterval | 一般加前缀set 其他:
| QAbstractSlider | singleStep:单步值 pageStep:在Slider上输入焦点,按PgUp和PgDn键改变的值 sliderPosition滑块位置 tracking:value和sliderPosition是否对应,该值为BOOL变量 orientation:Slider的方向,取值为Qt::Horizontal和Qt::Vertical invertedAppearance:显示方式是否相反,false时自左向右增大 invertedControls:PgUp和PgDn键是否对调 | tickPosition:标尺刻度的显示取值包括了:QSlider::NoTicks等6种,此处不在列举 tickInterval:刻度间隔,0时自动选择 |
QScrollBar( | 同上 | 无 | 同上 | |||
QDial | 同上 | notchesVisible notchTarget | 同上 | notchesVisible:小刻度是否可见 notchTarget:表盘刻度间的间隔像素值 | ||
QProgressBar | minimum maximum value textVisible orientation format |
| QWidget | format显示文字的格式,%p%显示百分比,%v显示当前值,%m显示当前值 | ||
QLCDNumber | digitCount smallDecimalPoint mode value intValue | QWidget::QFrame | digitCount显示数的位数,小数点也算一位 smallDecimallPoint是否有小数点 mode数的显示进制,setDecMode()设置成十进制,setBinMode()二进制setOctMode()八进制,setHexMode()十六进制 intValue返回显示的整数值 value返回当前值 |
滑动条配色
目标:使用滑动条改变颜色GRB和Alpha参数值,调整TextEdit的底色
使用的QColor类来设置颜色对象
//设置QColor类对象
void QColor::setRgb(int r, int g, int b, int a = 255)
//rgb未设置默认值,alpha值缺省为255
//设置调色盘类对象
QPalette::setColor(QPalette::Base,color)
//QPalette::Base 背景色,color颜色对象
void Widget::on_SliderRed_valueChanged(int value)
{ //拖动Red、Green、Blue 颜色滑动条时设置textEdit的底色
Q_UNUSED(value);//Q_UNUSED() 没有实质性的作用,用来避免编译器警告,因为value没有被使用
QColor color;
int R=ui->SliderRed->value(); //读取SliderRed的当前值
int G=ui->SliderGreen->value();//读取 SliderGreen 的当前值
int B=ui->SliderBlue->value();//读取 SliderBlue 的当前值
int alpha=ui->SliderAlpha->value();//读取 SliderAlpha 的当前值
color.setRgb(R,G,B,alpha); //使用QColor的setRgb()函数 获得颜色
QPalette pal=ui->textEdit->palette();//获取textEdit原有的 palette
pal.setColor(QPalette::Base,color); //设置palette的基色(即背景色)
ui->textEdit->setPalette(pal);//设置为textEdit的palette,改变textEdit的底色
}
日期时间
类 | 说明 | 属性/函数 | 属性说明 | 父类 | |
数据类 | QTime | 时间数据类型 | |||
QDate | 日期数据类型 | ||||
QDateTime | 日期时间数据类型 | currentDateTime() time() date() | currentDateTime()方法用来获取当前日期时间,返回类型是QDateTime类 time和date()获取对象的时间和日期 | ||
界面组件类 | QTimeEdit | 编辑显示时间组件 | QDateTimeEdit | ||
QDateEdit | 编辑显示日期组件 | QDateTimeEdit | |||
QDateTimeEdit | 编辑显示日期时间组件 | datetime date time maximumDateTime minimumDateTime maximumTime minimumTime currentSection currentSectionIndex calendarPopup displayFormat
| currentSection:返回当前光标所在的时间日期数据段 currentSectionINdex:用序号表示光标所在数据段 calendarPopup:允许弹出一个日历选择框 displayFormat:显示格式,如"yyyy-MM-dd HH:mm:ss"
| ||
QCalendarWidget | 日历组件 | selectionChanged() | 信号selectionChanged(),日历选择时发射此信号,返回的是QDate类 |
下拉列表和文本编辑组件
QComboBox是下拉列表组件,其列表中的每个项item,也叫列表项或项,可以关联一个QVariant类型的变量,专门用来存储不可见数据
QComboBox是个可见组件.可以直接在ui中进行编辑
QComboBox存储的虽然是个列表,但不支持访问列表,只能索引项
QPlainTextEdit是多行文本编辑组件,提供右键快捷菜单
QPlainTextEdit文字内容是以QTextDocument类型的文本对象 存储的,即以文本块的形式存储的,一个文本块就是一个段落,一个段落以回车符作为结束符,
一个文本对象包含多个文本块
对于一个文档document,包含了多个文本块,从document中提取文本块则是QTextBlock类型存储的
QTextEDit是所见所得的可编辑的带格式的文本编辑组件(用HTML格式标记定义的格式)
属性/函数 | 解释 | 父类 | ||
数据类型 | QTextDocument | int blockCount() QTextBlock findBlockByNumber(int blockNumber)
| int blockCount():获取文本块个数 QTextBlock findBlockByNumber(int blockNumber) 读取某个文本块,从0开始 | |
QTextBlock | text() | text()提取纯文字信息 | ||
界面组件 | QComboBox | clear() void addItem(const QString&, const QVariant& userData = QVariant()) int currentIndex() int count() QString currentText() QString itemText(int index) QVariant currentData(int role = Qt::UserRole) QVariant itemData(int index , int role = Qt::UserRole) void currentIndexChanged(int index) void currentIndexChanged(const QString& text) | addItem()可以给项关联自定义数据 currentIndex()返回当前项的序号,0开始 count()返回项总数 currentText()当前项的文字 itemText()指定索引号项的文字 currentData()返回当前项关联的自定义数据 currentIndexChanged()是信号,其中index是索引号,text是当前项的文字内容 | |
QPlainTextEdit | appendPlainText(const QString &text) QString toPlainText() const QTextDocument* document() customContextMenuRequested() createStandardContextMenu() | appendPlainText(const QString &text):添加一行字符串 toPlainText()提取全部字符输出成一个字符串 document()返回文本指针 customContextMenuRequested()是个信号,该信号表示右键菜单启动信号 createStandardContextMenu()创建显示标准菜单 |
//QComboBox添加自定义项的解释
void Widget::on_btnIni2_clicked()
{//初始化具有自定义数据的comboBox
//QMap自动根据 key排序
QMap<QString, int> City_Zone;
City_Zone.insert("北京",10);
City_Zone.insert("上海",21);
City_Zone.insert("天津",22);
City_Zone.insert("大连",411);
City_Zone.insert("锦州",416);
City_Zone.insert("徐州",516);
City_Zone.insert("福州",591);
City_Zone.insert("青岛",532);
ui->comboBox2->clear();
foreach(const QString &str,City_Zone.keys())
ui->comboBox2->addItem(str,City_Zone.value(str));
}
//城市名即key,作为项的显示文本,而区号即value作为项的关联的数据
//下拉列表时,是看不到关联的数据的
项
在下拉列表QComboBox类中,使用到了项
用于项处理的组件,有两类一个类是Item View,另一类是Item Widget,后者最常用
ItemView是基于Model/View结构存储数据
ItemWidget是基于直接把数据存储到每一个项中
树的遍历代码实现
void MainWindow::on_actScanItems_triggered()
{//遍历节点
for (int i=0;i<ui->treeFiles->topLevelItemCount();i++)
{
QTreeWidgetItem *item=ui->treeFiles->topLevelItem(i); //顶层节点
changeItemCaption(item); //更改节点标题
}
}
单元格的遍历实现
void MainWindow::on_btnReadToEdit_clicked()
{//将 QTableWidget的所有行的内容提取字符串,显示在QPlainTextEdit里
QString str;
QTableWidgetItem *cellItem;
ui->textEdit->clear(); //文本编辑器清空
for (int i=0;i<ui->tableInfo->rowCount();i++) //逐行处理
{
str=QString::asprintf("第 %d 行: ",i+1);
for (int j=0;j<ui->tableInfo->columnCount()-1;j++) //逐列处理,但最后一列是check型,单独处理
{
cellItem=ui->tableInfo->item(i,j); //获取单元格的item
str=str+cellItem->text()+" "; //字符串连接
}
cellItem=ui->tableInfo->item(i,colPartyM); //最后一列,党员
if (cellItem->checkState()==Qt::Checked) //根据check状态显示文字
str=str+"党员";
else
str=str+"群众";
ui->textEdit->appendPlainText(str); //添加到编辑框作为一行
}
}
Box
Box即盒子,箱子的意思
QToolBox类,工具箱类,在QToolBox按照"组" 为单位, 但实际上该"组"表示的是"项", 下图中就有3组(项)工具
类 | 属性/方法 | 解释 | 父类 | |
工具箱组件 | QToolBox | currentIndex currenItemText currentItemName currentItemIcon
| currentIndex:当前组编号,0开始 currentItemIndex当前组标题 currentItemName当前组类对象名 currenItemIcon"当前组的图标
| |
按钮Button
QToolButton类按钮,工具按钮,具有下拉菜单功能
类 | 属性 | 解释 | 父类 | |
功能按钮(可下拉菜单) | QToolButton | setDefaultAction()
setPopupMode(QToolButton::MenuButtonPopup) setToolButtonStyle(Qt::ToolButtonTextBesideIcon) setDefaultAction(QAction*) setMenu(QMenu*) QMenu::addAction(QAction*) | setDefaultAction()用于给按钮添加Action,每次单击菜单中的action都会触发action槽函数 setMenu()设置下拉菜单
setPopupMode() 设置弹出菜单模式, QToolButton::MenuButtonPopup枚举量,菜单是小箭头,按箭头弹出菜单,直接单击按钮只会启动该按QAction QToolButton::InstantPopup同理,但单击按钮不会启动相关QAction setToolButtonStyle(Qt::ToolButtonTextBesideIcon)设置按钮样式 setDefaultAction(QAction*) 设置按钮关联的Action setMenu(QMenu*) 设置按钮下拉菜单,首先创建一个菜单QMenu类对象,然后addAction()给菜单,最后添加到toolbox按钮上 | |
分隔
分割条QSplitter类,分割界面,左右分割,存在QSplitter对象时,可以运行时动态调整分割界面
//即可在ui中同时选择两个组件,工具栏选择分割布局按钮
//也可以手动添加代码
//在主窗口构造函数中,添加,就可以使splitter分割条分割整个主窗口
setCentralWidget(ui->splitter);
图标
Qt对图标也有相关的类,QIcon,在上述涉及到图标的内容中,添加图标的参数,参数都是QIcon类对象
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //设置ICON的图标
创建右键菜单
在QWidget类中,都会有信号customContextMenuRequested(),右键时自动发射该信号,只要给该信号编写槽函数,然后关联即可.
菜单类
Qt中和菜单相关的,必然是QMenu菜单类,关于QMenu的用法,上述已经提到
QMenu::exec()函数用来显示创建好的菜单
每个菜单选项关联一个QAction这样可以避免菜单里的功能和菜单类对象关联,每个QAction的槽函数负责每个菜单选项的功能实现,因此必须要在显示后删除菜单类对象.
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
Q_UNUSED(pos);
QMenu* menuList=new QMenu(this); //创建菜单
//添加Actions创建菜单项
menuList->addAction(ui->actListIni);
menuList->addAction(ui->actListClear);
menuList->addAction(ui->actListInsert);
menuList->addAction(ui->actListAppend);
menuList->addAction(ui->actListDelete);
menuList->addSeparator();
menuList->addAction(ui->actSelALL);
menuList->addAction(ui->actSelNone);
menuList->addAction(ui->actSelInvs);
menuList->exec(QCursor::pos()); //在鼠标光标位置显示右键快捷菜单
delete menuList; //手工创建的指针必须手工删除
}
停靠区域组件
QDockWidget类是停靠区域组件类,功能:实现在QMainWindow类对象窗口停靠,或 在桌面上浮动.
属性 | 属性解释 | 父类 | ||
QDockWidget | allowedAreas features topLevelChanged(bool) | setAllowedAreas(Qt::DockWidgetAreas areas):设置允许停靠的区域,参数是枚举类型Qt::DockWidgetAreas 可以设置在目标窗口的停靠位置 setFeatures(QDockWidget::DockWidgetFeature)设置停靠区域内组件的特性,如可关闭,可移动,可浮动,等参数是枚举类型 toLevelChanged()拖动浮动停靠时触发该信号 | QWidget | |
//QDockWidget实践
void MainWindow::on_actDockVisible_toggled(bool arg1)
{// 停靠区的可见性
ui->dockWidget->setVisible(arg1);
}
void MainWindow::on_dockWidget_visibilityChanged(bool visible)
{//停靠区可见性变化
ui->actDockVisible->setChecked(visible);
}
void MainWindow::on_dockWidget_topLevelChanged(bool topLevel)
{//停靠区浮动性变化
ui->actDockFloat->setChecked(topLevel);
}
void MainWindow::on_actDockFloat_triggered(bool checked)
{//停靠区浮动性
ui->dockWidget->setFloating(checked);
}
图片显示
QLabel是一个显示组件,可以显示图片,视频,文字等,通过QLabel设置一个QPixmap类,QPixmap用来显示图片,调整和设置图片.
QLabel *LabFileName;
QPixmap curPixmap; //当前的图片
float pixRatio;//当前图片缩放比例
//图片载入
QPixmap::load(QString &fileName) //直接载入一个图片
属性/函数 | 解释 | 父类 | ||
QPixmap | QPixmap scaledToHeight(int heiht) QPixmap scaledToWidth(int width) QPixmap scaled(int width, int height) load(QString &fileName) | scaledToHeight()返回一个根据高度缩放的副本 scaledToWidth() scaled()返回一个根据宽高缩放的副本 load()加载一个图片到QPixmap对象中 | ||
QLabel | setPixmap(const QPixmap&) | setPixmap()在QLabel标签上显示图片 | ||
滚动区域
QScrollArea属于控件容器类,可以直接在ui中拖出来。
字体
QFont
QFont font;
font.setBold(true);
font.setPointSize(12);//字体大小
//与QStandardItemModel结合起来看
void MainWindow::on_actFontBold_triggered(bool checked)
{//设置字体粗体
if (!theSelection->hasSelection())
return;
//获取选择单元格的模型索引列表
QModelIndexList selectedIndex=theSelection->selectedIndexes();
for (int i=0;i<selectedIndex.count();i++)
{
QModelIndex aIndex=selectedIndex.at(i); //获取一个模型索引
QStandardItem* aItem=theModel->itemFromIndex(aIndex);//获取项数据
QFont font=aItem->font(); //获取字体
font.setBold(checked); //设置字体是否粗体
aItem->setFont(font); //重新设置字体
}
}
Model/View结构
基本概念
用Model接口可以修改数据,在View组件中修改也会自动保存到Model中
模型/视图结构是Qt中组件显式和数据编辑的一种结构,View视图是界面组件,Model则是为数据和视图提供的一种接口模型。
Model和View交流时,可以使用代理,代理在数据被编辑时,通过模型和数据通信,且提供数据编辑器QLineEdit组件,代理则通过编辑器和View通信完成显示。
Model/View的典型应用是在数据库应用程序中。
一个数据模型可在多个视图组件中显示
Model类的继承关系 | ||||
QAbstractItemModel | QAbstractListModel | QStringListModel | ||
QAbstractProxyModel | QSortFilterProxyModel | |||
QAbstractTableModel | QSqlQueryModel | QSqlTableModel | QSqlRelationalTableModel | |
QStandardItemModel | ||||
QFileSystemModel |
主要学习的模型类Model
- QStringListModel 处理字符串列表数据
- QStandardItemModel 处理基于项数据的类,每个项的数据类型随意
- QFileSystemModel 处理系统文件数据
- 关于数据模型的基本信息
- 数据Model中,最基本的单元仍是项Item
- 每个item都有一个对应的row和column号,和一个father item
- List和Table数据格式中,所有的item都有一个 root item 顶层项
- Tree数据格式中,较为复杂。
- 数据索引:用QModelIndex类来表示模型索引类,为的是数据的存储和表示的隔离
- QModelIndex提供临时指针,来修改数据
- QPersistentModelIndex提供持久指针
- 索引必须提供:row,column,fatherItem三个参数
- 项item
- item role 项的角色数据:一个项可以有多个不同的角色数据,用于不同的场合(不同场合扮演不同角色)
- role往往是Qt::ItemDataRole枚举类型
- Qt::DisplayRole 表示item role是组件中显示的字符串,也是标准角色
- Qt::ToolTipRole 表示item role是鼠标提示的信息
- Qt::UserROle 表示item role是自定义数据
- role往往是Qt::ItemDataRole枚举类型
- value 项的值:即项存储的数据
- item role 项的角色数据:一个项可以有多个不同的角色数据,用于不同的场合(不同场合扮演不同角色)
主要学习的视图组件View
视图类组件,不像QListWidget等作为View的便利类,在项中存储数据,而是采用单独的数据类型,并不存储数据。
便利类适合小型数据,Model/View处理大型数据
在视图组件显示数据时,调用sertModel()为组件设置一个数据模型,完成Model和View的关联。
继承关系 | 组件针对的数据类型 | ||
QAbstractItemView | QListView | QListWidget | 列表数据 |
QTableView | QTableWidget | 表格数据 | |
QTreeView | QTreeWidget | 树形数据 | |
QColumnVIew | 多个QListView数据 | ||
QHeaderVIew | 表头 |
QModelIndex
- 数据索引:用QModelIndex类来表示模型索引类,为的是数据的存储和表示的隔离
- QModelIndex提供临时指针,来修改数据
- QPersistentModelIndex提供持久指针
- 索引必须提供:row,column,fatherItem三个参数
类 | 属性/函数 | 解释 |
|
QModelIndex | int column() const int row() const | column() 返回索引对象存的 列 row()返回索引对象存的 行 | |
QModelIndexList | int count() QModelIndex at(int) | count()返回列表包含总个数 at()返回第i个元素,返回类型是QModelIndex对象
| 就是QList<QModelIndex> |
QFileSystemModel
主要功能:该类提供一个访问主机系统文件的数据模型
配合组件:QTreeView,目录树显示文件列表
接口函数:见下表
类 | 属性/函数 | 解释 | |
QFileSystemModel | setRootPath() bool isDir(QModelIndex &index) QString filePath(QModelIndex&index) QString fileName(QModelIndex&index) QString type(QModelIndex &index) qint64 size(QModelIndex& index) QDir::currentPath() | setRootPath()设置根目录 isDir()判断节点是不是目录 filePath()返回节点的目录名 fileName()返回节点的文件名/文件夹名 type() 返回描述节点类型的文字,其中盘:Dirve,文件夹:File Folder 文件:后缀 File(txt File, exe File) size()返回节点的文件大小,文件夹返回0 | 不必思考QFileSystemModel是如何获取系统目录,组件是如何显示这些目录的,这是底层代码实现的. 只需要关联模型和组件即可实现. |
QTreeView | clicked(QModelIndex) setModel() | clicked() 信号,当点击树节点时,会发射该信号,传递节点类对象 setModel()给界面组件关联一个数据模型 |
QStringListModel
主要功能:处理字符串列表
配合组件:QListView,在界面上显示编辑字符串
属性/函数 | 解释 | ||
QStringListModel | setStringList(QStringList) QModelIndex QAbstractItemModel::index(int , int , const QModelIndex &) const bool setData(const QModelIndex&, const QVariant& value, int role = Qt::EditRole)
rowCount() stringList() | setStringList():把一个字符串列表对象作为模型的初始内容 index()返回根据father节点,row,col得到的模型节点的索引类对象 setData():根据索引对象指定的项,设置项数据,角色类型 rowCount()获取存储的行数 stringList()方法可以获得当前数据的最新字符串列表 | 数据操作 |
QListView | setModel() setEditTriggers(QAbstractItemView:: ) insertRow(int row) currentIndex() setCurrentIndex(QMoldeIndex) removeRow() removeRows(int row, int count) | setModel() setEditTriggers()设置该item/条/节点是否可编辑,参数是枚举类型QAbstractItemView::SelectedClicked,不可编辑则是NoEditTrrigers insertRow()在第row行前插入一行, 若row是最后一行则在row后追加一行,但不会创建item,只是个空行 currentIndex()获取当前项的模型索引index,index.row()返回行号 setCurrentIndex()设置索引对象 removeRow()删除一行代码,参数是index.row()行号 removeRows()从第row行删除count行
| 界面操作 |
QStandardItemModel
主要功能:以item为基础的标准数据模型,主要是二维数据表格
配合组件:QTableView
每个item都是一个QStandardItem类对象,和QTableView关联后,每个table的单元格对应model中的一个项.
一个表格所用到的类:
- 视图组件QTableView(需和Model关联)
- 数据模型QStandardItemModel
- 每个项是一个QStandardItem
- 项选择模型QItemSelecrtionModel(创建时需和Model关联)
属性/函数 | 解释 | ||
QStandardItemModel | columnCount() QStandardItem* horizontalHeaderItem(int column) const QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
QStandardItemModel(int rows, int columns, QObject *parent = Q_NULLPTR) setRowCount(int) setHorizontalHeaderLabels(QStringList)
void insertRow(int row, const QList<QStandardItem *> &items) removeRow(int)
QStandardItem* itemFromIndex(const QModelIndex &index) const | rowCount() columnCount()分别返回模型行列数 horizontalHeaderItem()返回第i行的表头项对象 headerData()获取指定的水平/垂直方向的第section个列/行表头项的自定义数据
QStandardItemModel()创建一个新的模型,指定行列数,和父类往往是this指针 setRowCount()设置模型包含的行数 setHorizontalHeaderLabels()设置行表头
insertRow()在第row行前插入一个QList对象,row为末尾时则在其后插入 removeRow()删除指定行
itemFromIndex()获取索引对象参数指定的项的数据 | 数据可以是程序生成也可以是文件. |
QStandardItem | QStandardItem() setTextAlignment(Qt::AlignLeft) | QStandardItem()重载了很多函数,可以直接将项数据以参数形式传递,完成QStandardItem类对象的创建及赋值 setTextAlignment()设置该项左对齐,右对齐时Qt::AlignRight,是枚举量,居中是Qt::AlignHCenter
| Model每个项的类型 |
QTableView | setModel(QAbstractItemModel *model) setSelectionModel(QItemSelectionModel *selectionModel) | setModel()关联一个Model setSelectionModel()关联一个selectionModel | |
QItemSelectionModel | QItemSelectionModel(QAbstractItemModel *model, QObject *parent) QModelIndex currentIndex() const void setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) bool hasSelection() const QModelIndexList selectedIndexes() const 信号: currentChanged(const QModelIndex ¤t, const QModelIndex &previous) | QItemSelectionModel()为模型关联一个选择模型 currentIndex()获取当前的模型索引号,返回一个QModelIndex对象 setCurrentIndex()设置该index为当前项,并发射currentChanged()信号 hasSelection()当该对象包含了任何一个项时,都返回true反之false selectedIndexes()返回一个选择项的索引列表 信号: currentChanged()发射当前位置和上次位置 | 该类主要用于跟踪单元格选择状态的类,获得选中单元格的索引对象 |
QStandardItemModel的应用
void MainWindow::iniModelFromStringList(QStringList& aFileContent)
{ //从一个StringList 获取数据,初始化数据Model
int rowCnt=aFileContent.count(); //文本行数,第1行是标题
theModel->setRowCount(rowCnt-1); //实际数据行数
//设置表头
QString header=aFileContent.at(0);//第1行是表头
//一个或多个空格、TAB等分隔符隔开的字符串, 分解为一个StringList
QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
theModel->setHorizontalHeaderLabels(headerList); //设置表头文字
//设置表格数据
int j;
QStandardItem *aItem;
for (int i=1;i<rowCnt;i++)
{
QString aLineText=aFileContent.at(i); //获取 数据区 的一行
//一个或多个空格、TAB等分隔符隔开的字符串, 分解为一个StringList
QStringList tmpList=aLineText.split(QRegExp("\\s+"),QString::SkipEmptyParts);
for (j=0;j<FixedColumnCount-1;j++) //tmpList的行数等于FixedColumnCount, 固定的
{ //不包含最后一列
aItem=new QStandardItem(tmpList.at(j));//创建item
theModel->setItem(i-1,j,aItem); //为模型的某个行列位置设置Item
}
aItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,需要设置
aItem->setCheckable(true); //设置为Checkable
if (tmpList.at(j)=="0")
aItem->setCheckState(Qt::Unchecked); //根据数据设置check状态
else
aItem->setCheckState(Qt::Checked);
theModel->setItem(i-1,j,aItem); //为模型的某个行列位置设置Item
}
}
/*思路:
把文本以QStingList形式传递进来;
把每一行存到QSting对象中;
把每个对象用QStringList.split()分割成块;
把每个块按(i,j)顺序逐个作为每个项QStandardItem的值;
依次把QStandardItem放入QStandardItemModel对象中;
其中表头和表尾两行需要单独设置其表格属性.
*/
自定义代理
暂无
应用程序
QCoreApplication | QString QCoreApplication::applicationDirPath() | applicationDirPath()返回的是当前程序所在的绝对路径 | |
文件
文件实例
打开文件
void MainWindow::on_actOpen_triggered()
{ //打开文件
QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//调用打开文件对话框打开一个文件
QString aFileName=QFileDialog::getOpenFileName(this,"打开一个文件",curPath,
"井数据文件(*.txt);;所有文件(*.*)");
if (aFileName.isEmpty())
return; //如果未选择文件,退出
QStringList fFileContent;//文件内容字符串列表
QFile aFile(aFileName); //以文件方式读出
if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以只读文本方式打开文件
{
QTextStream aStream(&aFile); //用文本流读取文件
ui->plainTextEdit->clear();//清空
while (!aStream.atEnd())
{
QString str=aStream.readLine();//读取文件的一行
ui->plainTextEdit->appendPlainText(str); //添加到文本框显示
fFileContent.append(str); //添加到 StringList
}
aFile.close();//关闭文件
this->LabCurFile->setText("当前文件:"+aFileName);//状态栏显示
ui->actAppend->setEnabled(true); //更新Actions的enable属性
ui->actInsert->setEnabled(true);
ui->actDelete->setEnabled(true);
ui->actSave->setEnabled(true);
iniModelFromStringList(fFileContent);//从StringList的内容初始化数据模型
}
}
保存文件
void MainWindow::on_actSave_triggered()
{ //保存为文件
QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//调用打开文件对话框选择一个文件
QString aFileName=QFileDialog::getSaveFileName(this,tr("选择一个文件"),curPath,
"井斜数据文件(*.txt);;所有文件(*.*)");
if (aFileName.isEmpty()) //未选择文件,退出
return;
QFile aFile(aFileName);
if (!(aFile.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)))
return; //以读写、覆盖原有内容方式打开文件
QTextStream aStream(&aFile); //用文本流读取文件
QStandardItem *aItem;
int i,j;
QString str;
ui->plainTextEdit->clear();
//获取表头文字
for (i=0;i<theModel->columnCount();i++)
{
aItem=theModel->horizontalHeaderItem(i); //获取表头的项数据
str=str+aItem->text()+"\t\t"; //以TAB见隔开
}
aStream<<str<<"\n"; //文件里需要加入换行符 \n
ui->plainTextEdit->appendPlainText(str);
//获取数据区文字
for ( i=0;i<theModel->rowCount();i++)
{
str="";
for( j=0;j<theModel->columnCount()-1;j++)
{
aItem=theModel->item(i,j);
str=str+aItem->text()+QString::asprintf("\t\t");
}
aItem=theModel->item(i,j); //最后一列是逻辑型
if (aItem->checkState()==Qt::Checked)
str=str+"1";
else
str=str+"0";
ui->plainTextEdit->appendPlainText(str);
aStream<<str<<"\n";
}
}
对话框Dialog
对话框类,往往在调用时,会弹出一个对话框.
标准对话框
标准对话框往往是和文件,颜色,字体,输入和信息提示相关.
类介绍
类 | 属性/函数接口 | 解释 | 备注 |
QFileDialog | QString getOpenFileName(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString()) QString getOpenFileNames() QString getExistingDirectory(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), Options options = ShowDirsOnly) QString getSaveFileName() | getOpenFileName()返回选择文件的完整路径(绝对路径+文件名), 其中filter是过滤器的意思,用于选择不同后缀的文件,见备注 getOpenFileNames()同理,只是返回多个选择的文件路径 getExistingDirectory(),caption是对话框标题,dir是路径参数,options一般使用ShowDirsOnly表示只显示路径,该函数返回的是你选择的路径,而QCoreApplication::applicationDirPath()则是返回当前程序所在的绝对路径 getSaveFileName()和getOpenFileName()函数参数一致,但是将返回一个文件保存的路径,注意! 该函数并不创建实质性的文件,只是返回其名字路径而已. |
|
QColorDialog | QColor getColor(const QColor &initial = Qt::white, QWidget *parent = Q_NULLPTR, const QString &title = QString(), ColorDialogOptions options = ColorDialogOptions()) | getColor()选择颜色对话框,参数initial为初始颜色,parent往往是this指针,title则是对话框标题,该函数返回的是一个你选择好的颜色QColor对象 | |
QFontDialog | QFont getFont(bool *ok, const QFont &initial, QWidget *parent = Q_NULLPTR, const QString &title = QString(), FontDialogOptions options = FontDialogOptions()) | getFont()提供一个字体选择对话框,返回一个你选择好的字体QFont对象, 由于QFont没有判断字体是否有效的函数,因此需定义bool变量,作为引用参数传递给getFont(),从而判断QFont是否生效.(注意应在调用函数前把ok设为false) 函数initial是初始字体,title是对话框标题
| |
QInputDialog | QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool *ok = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
int getInt(QWidget *parent, const QString &title, const QString &label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool *ok = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags())
double getDouble(QWidget *parent, const QString &title, const QString &label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags())
QString getItem(QWidget *parent, const QString &title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) | getText()通过对话框获得单行字符串,parent往往是this指针;title是对话框标题;label是对话框中编辑框左上方的提示文字;mode则是编辑框的显示方式;ok则是判断是否有效.
getInt()则是通过对话框获得一个int值,其中value是显示在编辑框中的初始值,step则是每次按⬆️⬇️时增加的值
getDouble()同理,只是返回一个double值而已,其中decimals表示小数点位数
getItem()返回一个选择的/输入的QString对象,其他一致,但区别是: 提供一个有下拉列表的选择框,其列表是QStringList对象,因此需要先创建好QStringList对象 其中current表示列表初始显示的项,editable表示该选择框是否能编辑,即该选择框既可以输入内容也可以选择内容. |
QLineEdit枚举类型控制着对话框中编辑框的显示方式 QLineEdit::Normal正常显示 QLineEdit::Password密码显示 同样的QInputDialog也没有判断生效的函数,需要传递bool变量作为引用传递给它.
|
QMessageBox |
|
| 该对话框用于显示信息和确认选择 |
QMessageBox:: StandardButton 按钮的枚举类型 | QMessageBox::Ok QMessageBox::Cancel QMessageBox::Close |
部分代码实现
//主要是QMessageBox的实现
//QMessageBox::question()提示一个❓图标
void Dialog::on_btnMsgQuestion_clicked()
{
QString dlgTitle="Question消息框";
QString strInfo="文件已被修改,是否保存修改?";
QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; //缺省按钮
QMessageBox::StandardButton result;//返回选择的按钮
result=QMessageBox::question(this, dlgTitle, strInfo,
QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
defaultBtn);
if (result==QMessageBox::Yes)
ui->plainTextEdit->appendPlainText("Question消息框: Yes 被选择");
else if(result==QMessageBox::No)
ui->plainTextEdit->appendPlainText("Question消息框: No 被选择");
else if(result==QMessageBox::Cancel)
ui->plainTextEdit->appendPlainText("Question消息框: Cancel 被选择");
else
ui->plainTextEdit->appendPlainText("Question消息框: 无选择");
}
//QMessageBox::information()提示一个ℹ️图标
void Dialog::on_btnMsgInformation_clicked()
{
QString dlgTitle="information消息框";
QString strInfo="文件已经打开,字体大小已设置";
// QMessageBox::information(this, dlgTitle, strInfo);//使用缺省的按钮
QMessageBox::information(this, dlgTitle, strInfo,
QMessageBox::Ok,QMessageBox::NoButton);
}
//QMessageBox::warning()提示一个⚠️图标
void Dialog::on_btnMsgWarning_clicked()
{
QString dlgTitle="warning 消息框";
QString strInfo="文件内容已经被修改";
QMessageBox::warning(this, dlgTitle, strInfo);
}
//QMessageBox::critical()提示一个❌图标
void Dialog::on_btnMsgCritical_clicked()
{
QString dlgTitle="critical消息框";
QString strInfo="有不明程序访问网络";
QMessageBox::critical(this, dlgTitle, strInfo);
}
//QMessageBox::about()无图标,仅仅是现实一个信息和按钮
void Dialog::on_btnMsgAbout_clicked()
{
QString dlgTitle="about消息框";
QString strInfo="我开发的数据查看软件 V1.0 \n 保留所有版权";
QMessageBox::about(this, dlgTitle, strInfo);
}
效果预览
自定义对话框
自定义对话框类,一般是从QDialog类继承,采用UI设计器可视化设计方法.
需要注意的是:
- 创建对话框,
- 传递数据给对话框显示,(考虑对话框显示的初始值)
- 对话框获取输入,
- 判断对话框按钮状态及按钮返回类型
- 释放对话框对象占用内存(应合理选择是否删除对话框对象,若后期仍需要对话框保留当前数据,应不删除,反之应删之)
模态显示:必须关闭对话框才能返回主窗口
非模态显示:对话框和主窗口可以同时处理,且二者存在互动性
多窗体
窗体类
MDI(Multi-document interface)
Splash登陆界面窗体
颜色
类 | 属性/函数 | 解释 | |
QPalette | 一般都可以通过.palette()获取调色盘,一些文字编辑器类中往往包含了palette和color属性 | ||
QColor | bool isValid() | isValid()判断QColor对象是否有效 | 一般颜色的类往往是QColor,且可以通过.color()获取当前颜色 |