主要是总结学习开发过程中遇到的一些知识点,方便复习.

全局定义

  • 在<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()获得字符串文本行数
        •  
  • 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/QPlainTextEdit

 

在下拉列表QComboBox类中,使用到了项

用于项处理的组件,有两类一个类是Item View,另一类是Item Widget,后者最常用

ItemView是基于Model/View结构存储数据

ItemWidget是基于直接把数据存储到每一个项中

  解释 属性/方法 属性解释 父类
ItemView QListView 在Model/View章有详细解释
QTreeView
QTableView
QColumnView
ItemWidget QListWidget 一行一项,存储多个项的列表组件,每个项是一个QListWidgetItem类对象,ui界面双击可编辑

QListWidgetItem::flags

QListWidgetItem::takeItem(int row)

QListWidgetItem::setCheckState(Qt::CheckState)

QListWidget::clear()

QListWidget::addItem()

QListWidget::insertItem(int row, QListWidgetItem * )

 

信号:

currentRowChanged(int row)

currentItemChanged(QListWidgetItem*current,QListWidgetItem* pre);

curentItemChanged(const QString&)

 

setFlags()时,选择参数:

Qt::ItemIsSelectable

Qt::ItemIsEditable 该项是否可编辑

Qt::ItemIsDragEnabled   该项是否可拖动

Qt::ItemisDropEnabled    该项是否可以接收拖放的项

Qt::ItemIsUserCheckable  是否可以选中

takeItem() 移除第row行的Item,但需要手动用delete 删除项

setCheckState()设置项的复选状态

clear()清空列表

addItem() 每个项都是一个QListWidgetItem类对象,先创建该类对象,然后用addItem()方法把该项添加到列表中

insertItem()在第row行前插入一个Item

 

currentRowChanged()信号发射且传递当前项行号

currentItemChanged()信号发射,传递当前项和前一项

curentItemChanged()当前项内容发生变化

QListView
QTreeWidget

    一节点一项,每个节点都是一个         QTreeWidgetItem类对象,添加节点必然先定义该类对象

    创建节点的类型往往是枚举量,且值大于1000

    树包括了顶层节点和分组节点,其中分组节点级数无限制

    添加节点时,最好确保父子节点设定的类型相同.

节点的操作:

QTreeWidgetItem::type()

QTreeWidgetItem::setIcon()

QTreeWidgetItem::setText()

QTreeWidgetItem::setFlags()

QTreeWidgetItem::setData(int column, int role, const QVariant&)

currentItem();

QTreeWidgetItem::addChild()

removeChild()

childeCount()

树的操作:

QTreeWidget::addTopLevelItem()

currentItemChanged()

takeTopLevelItem(int index)

int topLevelItemCount()

QTreeWidgetItem* topLevelItem(int index);

 

 

节点:

type()返回节点类型

setIcon()设置某列的图标,传递图标参数和列号数字

setText()设置某列的文字,同上

setFlags()设置节点的属性

currentItem()获取当前节点,返回QTreeWidgetItem类对象

addChild()给调用者添加子节点

removeChild()移除节点从树中,需要手动delete节点

childCount()子结点个数

setData()设置节点数据

树:

addTopLevelItem()把节点作为顶层节点添加到树中

currentItemChanged()树改变时,会自动发射该信号

takeTopLevelItem(int index)删除顶层节点

topLevelItemCount() 顶层节点总个数

topLevelItem()返回序号是index的顶层节点

 
QTableWidget

一单元格一项,Table即桌子,表,表格的意思

     是表格组件类,表格第一行为行表头,第一列是列表头,表头不可编辑,

    每个单元格是一个QTableWIdgetItem对象,且可存储一个QVariant变量

    每次向表格添加单元格内容时,需要先创建QTableWidgetItem类对象

   一般创建表格,先定列数,然后增加行数

单元格/表格设置:

setHorizontalHeadeLabels(QStringList headerText)

setColumnCount(int)

 

setTextAlignment()

setBackground(const QBrush&)

setForeground(const QBrush&)

setIcon(const QIcon&)

setFont(const QFont&)

setCheckState(Qt::CheckState)

 

setData(int role, const QVariant&)

QTableWidgetItem::QTableWidgetItem(const QString&,int type = Type)

setVisible()

 

单元格修改:

insertRow(int row)

removeRow(int row)

clearContents()void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)

 

单元格信息获取:

currentColumn()

currentRow()

type()

horizontalHeader()

verticalHeader()

rowCount()

QTableWidgetItem *QTableWidget::item(int row, int column) const

 

信号:

currentCellChanged(int cRow,int cCol,int preRow,int preCol)

currentCellChanged(QTableWidgetItem*, QTableWidgetItem*)

单元格设置:

setHorizontalHeadeLabels() 设置行表头

setColumnCount()设置表格列数

 

setTextAlignment() 设置文字对齐方式

setBackground(const QBrush&) 设置单元格背景颜色

setForeground(const QBrush&)  设置单元格前景颜色

setIcon(const QIcon&)  设置单元格图标

setFont(const QFont&)  设置单元格字体

setCheckState()设置单元格勾选状态,单元格会出现QCheckBox组件

 

setData()设置自定义数据,role表示节点角色值,往往是枚举类型Qt::UserRole

QTableWidgetItem():创建单元格,qt默认构造函数,参数1单元格内容,参数2该节点/单元格的类型

setVisible()设置行和列表头是否可见,一次只能设置一个表头

 

单元格修改:

insertRow()在第row行前插入一行, 若row是最后一行则在row后追加一行,但不会创建item,只是个空行

removeRow()删除行和item

clearContents()清空表格,但不清空表头setItem()在第row行第col列设置单元格item

 

单元格信息获取:

currentColumn()  获取当前行列

currentRow()

type()获取单元格类型

horizontalHeader()获取行表头,

verticalHEader()获取列表头

rowCount()返回表格数据区的行数

item() 根据行列返回单元格/项

 

信号:

currentCellChanged():QTableWidget有信号:当单元格发生切换时,发射

currentCellChanged()

 
  QTabWidget Tab即标签的意思,也叫多页(标签)容器类组件

tabPosition

currentIndex

currentTabText

currentTabName

currentTabIcon

tabPosition:页标签位置,浏览器通常在顶部,可选择

currentIndex:当前页编号

currentTabText:当前页标题

currentTabName:当前页类对象名称

currentTabIcon:当前页图标

 

 

标签容器类组件QTableWidget
QListWidget

树的遍历代码实现

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是自定义数据
      • value 项的值:即项存储的数据

主要学习的视图组件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

rowCount()

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 &current, 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()函数参数一致,但是将返回一个文件保存的路径,注意! 该函数并不创建实质性的文件,只是返回其名字路径而已.

文件过滤器实例:
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif);;所有文件(*.*)"
每组文件之间用两个;;隔开,
同一组内不同的后缀用空格 隔开,且*表示无视.jpg前的一切

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);
}


效果预览

getOpenFileName()效果
getExistingDirectory和applicationDirPath函数的区别
QColorDialog
QFontDialog

 

 

QMessageBox

自定义对话框

自定义对话框类,一般是从QDialog类继承,采用UI设计器可视化设计方法.

需要注意的是:

  1. 创建对话框,
  2. 传递数据给对话框显示,(考虑对话框显示的初始值)
  3. 对话框获取输入,
  4. 判断对话框按钮状态及按钮返回类型
  5. 释放对话框对象占用内存(应合理选择是否删除对话框对象,若后期仍需要对话框保留当前数据,应不删除,反之应删之)

模态显示:必须关闭对话框才能返回主窗口

非模态显示:对话框和主窗口可以同时处理,且二者存在互动性

 

多窗体

窗体类

 

MDI(Multi-document interface)

 

Splash登陆界面窗体

 

颜色

属性/函数 解释  
QPalette     一般都可以通过.palette()获取调色盘,一些文字编辑器类中往往包含了palette和color属性
QColor

bool isValid()

isValid()判断QColor对象是否有效 一般颜色的类往往是QColor,且可以通过.color()获取当前颜色

 

 

 

 

 

 

 

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐