QT5系统学习

QT5系统学习

day_01

  • 搭建项目方案: QCreator VS EClipse c++
  • QGridLayout :
    • addWidget (所添加的widget对象,行,列,所占行数,所占列数);
    • contentSpacing和 layout内widget的距离
  • QFormLayout: 第一列(LabelCloumn)的左对齐,右对齐

day_02

button

  • Qwidget的sizePolicy:关键sizeHint;
  • Fixed: 固定大小,尺寸取自sizeHint
  • MIninum:widget的最大值就是sizeHint
  • Maxinum:widget的最小值就是sizeHint
  • Prefferd:sizeHInt的大小就是最好的,不过也可以拉伸收缩
  • Expanding: 可伸展 ,尽可能多的占据空白
  • MininumExpanding:可以使用多余的空白
  • Ignored:忽略sizeHint的大小,尽可能的占用空白
  • Expanding和Preferred的区别: 当一个Form包含两个widget时,form大小变化时额外的空白处给予expanding widget,而preferred widget保持气其大小为sizeHint.

  • 自定义一个控件,重写他的sizeHInt

 public : 
         virtual QSize sizeHInt( ) const ;
 QSize PushBtton :: sizeHint() const
 {
 return Qsize(80,100);
 }     
  • button中的mousetracing属性: true : 鼠标不用按下就可以触发mouseMove事件;

  • toolbutton

  • 可以自定义Qmenu对象添加action,toolbutton可以添加这Qmenu对象,实现按钮的下拉框. 添加的方法 button.setMenu(Qmenu *menu);
    menu的展示方式: button中的poppupMode属性
  • radioButton
  • autoExcutive 所有的radioButton自动互斥
  • 默认的是同一个parent下的radioButton互斥
  • QTranslator 的使用. 设置app的语言
  • 加载指定的qm文件.
  • QApplication的installTranslator方法.
    [static] bool QCoreApplication::installTranslator(QTranslator translationFile)
    Adds the translation file translationFile to the list of translation files to be used for translations.

输入控件

  • 信号和槽
  • signals slot connect;
  • connect在emit之前实现;
  • 多次连接便会多次实现. 必要时 disconnect或者连接策略有一个 UniqueConnecttion,connect的第五个参数(连接策略);
  • Q_INVOKE对构造函数进行声明,声明成槽函数;
  • 构造函数和析构函数不能定义在signals和slots下;
  • QLineEdit
  • textChanged和textEdit信号的区别: 后者只有在代码改变了textLine的文本时触发,不像前者在界面操作时改变了textLine的值时都会触发
  • qTextEdit
  • 可以编辑Document.富文本编辑器
  • Plain Text Edit 纯文本编辑器

显示控件

  • QTextBrowser
  • 只显示本地文件,不能显示网络文件,也就是以http开头的这些文件,网络资源文件
  • 支持html子集,并不支持所有的html标签

item views

item widgets

  • 列表控件
  • listWidget和listWidgetItem一起使用
  • selctionMode 选择模式属性

day03

  • QtVaraintProperty 如何获得enum类型的property的TypeId.
    源码如下.
d_ptr->m_comboBoxFactory = new QtEnumEditorFactory(this);
const int enumId = QtVariantPropertyManager::enumTypeId();
d_ptr->m_factoryToType[d_ptr->m_comboBoxFactory] = enumId;
d_ptr->m_typeToFactory[enumId] = d_ptr->m_comboBoxFactory;

day04

Item Widget

  • llistWidget
  • addItem和inserItem
  • treeWidget
  • addTopLevelItem
  • topItem下添加children子节点
  • tabwidget
  • setItem设置Item
  • 表头的设置
  • setHorizontalHeaderItem 可以设置icon
  • setHorizontalHeaderLabels 不能设置icon

容器控件

  • groupBox 没啥看的
  • scrollArea 没啥看的.
  • ToolBox 抽屉控件 不要设置太多抽屉,否则抽屉里的内容很小,视觉效果差
  • 早期的qq头像列表
  • tabWidget 没啥看的
  • stackWidget
  • 可以通过重写键盘事件来绑定切换的按钮. (需要设置焦点setFocus,否则无法触发键盘事件.)
  • 同时只显示一个Widget
  • MdiArea
  • 提供一个多文档显示区域
  • dockWidget 没啥好说的
  • 关闭按钮并不会把这个dockWidget从内存中delete,只是隐藏了显示,ctrl双击标题即可重新显示.

其他控件

  • QSpliter
  • 可折叠属性 setCollapsible(int index,bool collapse)
  • QDialog
  • accepted rejected finished
  • QFileDialog
  • 几个常用的静态方法
    • 打开文件对话框
    • 保存文件对话框
    • 打开文件夹对话框
  • QErrorMessage
  • QInutDialog
  • 五种界面类型: double ,int ,item(多选框) ,multiLine text(多行文本),signle line text.
  • double 嵌入的是double spin box
  • int 嵌入的是 spin box
  • item 嵌入的是 combox
  • QMessageBox 六种使用场景
  • about 关于
  • aboutQT 关于QT
  • critical 严重错误
  • information 显示信息
  • question 疑问
  • warning 警告
  • QProgressDialog 对话框中嵌入了进度条
  • autoClose属性 会自动delete你写的dialog,堆栈变量不能delete,所以要用指针
  • QProgressDialog * dia; dia=new QProgressDialog ; 必须这样做
  • QColorDialog
  • QWizard (向导对话框)
  • 需要调用addPage加入QWizardPage
  • QMenu
  • QMenu addAction添加一级菜单
    addMenu 添加二级菜单
  • QDesktopWidget
  • 不会显示的widget,表示操作系统的桌面
  • QRubberBand
  • 代表一个选择的区域.可以用来做一个屏幕截图工具.
  • QSizeGrip
    在dialog和statusbar中又sizegrip
    自定义的时候需要手动定位到右下角

  • QSplashScreen

  • 调用setPixmap
  • 调用showMessage
  • 调用finish,等待maindow显示,关闭QSplashScreen
  • QStatusBar(状态条)和QToolBar(工具栏)和QMenubar(菜单栏)

  • QWidgetAction 继承自QAction

  • QTabBar.没啥好看的

  • QToolTip 为任何其他的widget提供 tool tips

day05

QFile

  • 新建文件
  • 对象的创建
  • Qfile file(“文件路径”)
  • Qfile file;
    file.setName(“文件路径”);
  • file.open(指定打开方式);
  • file.readLine(); 读取一行(返回值是QString);
  • file.readAll();读取全部(返回值是二进制数据);
  • file.write(“二进制数据”)
  • 信号的block: 被block的信后,在block结束后,不会再自动发出;

  • QDatastream和QTextStream

  • QDataStream
  • 第一种:操作device(file,buffer)
  • 第二种 :操作ByteArray
  • QTemporaryFile: 临时文件.

  • QTemporaryDir

  • QSaveFile 安全写文件,保证写的文件不会丢失.写完有commit提交操作.

  • QSettings操作INI文件(INI格式另外了解)

  • beginGroup endGroup
  • beginWriteArray endArry [setArryIndex ] 写
    beginReadArry endArry 读

中文的时候需要设置codec(GBK 或者GB2312或者 UTF-8),否则会出现奇奇怪怪的东西

  • 注册表的微软的一个重要的数据库,保存系统程序和应用程序的信息
  • 注册表操作也是通过QSettings类进行操作的
  • QSettings setting(QSettings :: NativeFormat,QSettings::UserScope,“不知道是啥”)
    但是QSettings的缺点: key中不能带斜杠(正反都不行) ;

QDir

  • 构造方法:QDir(QString &path)::直接传入文件的路径
  • 有自带的递归删除非空目录的方法 removeRecursively(); 返回值是bool
  • 一个windows的文件夹中会多出./ 和…/文件 ,分别表示当前文件和上级文件.

QDirIterator

  • 文件遍历器
  • 有方法 返回fileName filePath 等
  • 最重要的功能是实现递归子文件夹的功能;

QStandardPath

  • 查找可执行文件
  • 定位某个文件或者文件夹
  • 获取标准路径的文件路径

QFileInfo 文件的各种信息

  • 没啥好看的

数据库操作

  • QSqlDatabase
  • QSqlquery 返回一条或多条
  • QSqlRecord 含有多个字段
  • QSqlField 某一字段

day06

数据存储读写

  • 常见的数据存储格式: office 数据库 xml csv ini json …
  • QTextStream的endL方法(换行),输出\n,而记事本中的换行是\r\n;

bxe格式

  • 修改注册表 Current User

xml格式

  • 流式操作 基于DOM操作 SAX2操作
  • QXmlReader QT有写好的API

CSV格式

  • QMutableListIterator 类
  • 打包工具: INSIS 和 INNO SetUp

QT 枚举类

自定义类中的自定义枚举,如下操作

#include 
class Car : public QObject
{
    Q_OBJECT
public:
    Car(QObject *parent = 0) {}
    ~Car() {}
    enum Color { RED, GREEN, BLUE };
    Q_ENUM(Color)
};
main.cpp部分代码
QMetaEnum metaColor = QMetaEnum::fromType<Car::Color>();
bool isOk = false;
qDebug()<<metaColor.valueToKey(Car::BLUE);
qDebug()<<metaColor.keyToValue("BLUE", &isOk)<<isOk; // OR
qDebug()<<metaColor.keyToValue("Car::BLUE", &isOk)<<isOk; 
————————————————
版权声明:本段代码为CSDN博主「Qt君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nicai_xiaoqinxi/article/details/90019691

QTreeView 的多选

Q_SIGNALS:
    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    void currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void currentColumnChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void modelChanged(QAbstractItemModel *model);

一般如果设置选中模式为单个元素,那么使用currentChanged信号即可;
如果是单行,那么使用currentRowChanged信号即可;
如果是多选,一般使用selectionChanged信号。
其他不常用,使用方法类似,根据情况选用。

3,槽函数处理
1,定义对应的槽函数(这里3个信号都处理,是为了演示用法,实际一般只处理其中一种信号)

private:
    void slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    void slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous);
    void slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);

2,绑定信号

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitTree();
    connect(ui->treeView->selectionModel(),&QItemSelectionModel::selectionChanged,this,&MainWindow::slotSelectionChanged);
    connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentChanged,this,&MainWindow::slotCurrentChanged);
    connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentRowChanged,this,&MainWindow::slotCurrentRowChanged);
}

3,槽函数实现

//选中内容变化,覆盖单选和多选的情况
void MainWindow::slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
    QItemSelectionModel *selections = ui->treeView->selectionModel();
    QModelIndexList indexes = selections->selectedIndexes();    //得到所有选中的index
    foreach(QModelIndex index, indexes)
    {
        //从索引index获取item指针,mModel是tree的数据Model,这里是QStandardItemModel*类型
        QStandardItem* item = mModel->itemFromIndex(index);
        if (item)
        {
            //你的操作,比如取文本、取附带的data
            //QString text = item->text();
            //QString data1 = item->data(Qt::UserRole + 1).toString();
            //QString data2 = item->data(Qt::UserRole + 2).toInt();
        }
    }
}

//当前选中index变化,单个
void MainWindow::slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
    QStandardItem* item = mModel->itemFromIndex(current);
    if (item)
    {
        //你的操作,同上
    }
}

//当前选中行变化,单行
void MainWindow::slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
    //取选中的这行的第一个元素的index
    QModelIndex index = current.sibling(current.row(),0);
    QStandardItem* item = mModel->itemFromIndex(index);
    if(item)
    {
        //你的操作,同上
    }
}

新年踩坑 1月2号

  • 树形结构中使用QStandardItemModel ,在item()方法中传入index,可以识别并获取非child的QstandardItem.
    model->item()获取的QstandardItem是最顶层样式的model下的QStandardItem,它是忽略child QStandardItem的.QT5系统学习_第1张图片
    比如上面的图片,给item的参数(1,0),它会定位到WT1A的位置,获取该QStandardItem…这个item()方法是QStandardItemModel中的方法.

一月三号

QString().isNull(); // returns true
QString("").isNull(); // returns false
QString(“abc”).isNull(); // returns false 和 Java中一样嘛zzzzz

一月17号

QByteArray 有中文时会出现乱码问题:
QProcess启动外部程序的 踩坑:
使用start可以设置外部程序的工作目录;
使用execute设置无效,只能继承主程序的工作目录,这就会导致一个问题,如果外部程序使用了相对路径访问自己程序所在文件夹的下层文件,将无法找到文件!

QT解析json数组

    //这里document是一个QJsonDocument
    QVariantList list = document.toVariant().toList();
    for(int i = 0; i<list.count(); i++)
    {
        QVariantMap map = list[i].toMap();
        qInfo()<<map["name"].toString();
        qInfo()<<map["age"].toString();
   }

你可能感兴趣的:(QT5系统学习)