Qt系列文章之 QAbstractItemModel(下)

2023-10-26

本文紧接着上一文介绍如何对用户模型剩下的类进行实现,并将其集成到视图并显示出来。

QAbstractItemModel

  • insertRows(int row, int count, const QModelIndex &parent)
    该函数实现一次性向表格之中从row位置开始插入count行,一个简单的实现手段是:
{
    if(row<0 || row>m_dataVector->size() || count<1) return false;
    beginInsertRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
        QPair<QString,int> newPair{};
        m_dataVector->insert(row+i,newPair);
    }
    endInsertRows();
    return true;
}
  • insertColumns(int column, int count, const QModelIndex &parent)
    由于表格固定是两列,所以此处不做处理。
{
    beginInsertColumns(parent, column, column + count - 1);
    endInsertColumns();
    return false;
}
  • removeRows(int row, int count, const QModelIndex &parent)
    删除行与前面的方法类似,此处一个简单实现如下:
{
    if(row<0 || row>m_dataVector->size() || count<1 ) return false;
    beginRemoveRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
        if(m_dataVector->size()==0) return true;  //判断是否已经删除完,如果已完,提前退出
        m_dataVector->remove(row);
    }
    endRemoveRows();
    return true;
}
  • removeColumns(int column, int count, const QModelIndex &parent)
    类似的,此处也不需要对删除列进行操作:
{
    beginRemoveColumns(parent, column, column + count - 1);
    // FIXME: Implement me!
    endRemoveColumns();
    return false;
}

下一步构造一个简单的视图,实现对数据的显示。进入main.cpp,对前期的界面显示代码进行注释:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

//    mainWindow w;
//    w.show();

包含需要的头文件:

#include <QTableView>
#include "customtableview.h"

此处使用标准的QTableView来显示图标,构建一个视图,构建一个用户模型示例并将其设置为视图的模型,最后显示视图。

    QTableView view;         //构造视图
    CustomItemModel model;   //构造模型
    view.setModel(&model);   //设置视图的模型
    view.show();             //显示视图

编译运行代码,显示表格:
在这里插入图片描述

再在用户模型之中加入一个写入数据的槽函数:

void CustomItemModel::pushData(QString &name, int &age)
{
    m_dataVector->push_back(QPair<QString,int>(name,age));
    m_checked.push_back(QPair<bool,bool>(false,false));
    emit dataChanged(
        createIndex(m_dataVector->size()-1,0),
        createIndex(m_dataVector->size()-1,1),
        QVector<int>() << Qt::DisplayRole<<Qt::CheckStateRole
                     );
}

调用对象的槽函数,写入几个测试数据:

    model.pushData("Jim",28);
    model.pushData("White",72);

运行模型:
在这里插入图片描述

后面我对数据其他一些角色进行修改,增加一个图标显示,比如Name列显示红色,Age列显示绿色。

    case Qt::DecorationRole://The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)
    {
        if(index.column()==0) return QColor(255,0,0,255); //Name显示 红色
        if(index.column()==1) return QColor(0,255,0,255); //Age列显示绿色
    }

运行代码:
在这里插入图片描述

再给每个条目显示一个勾选框:
在这里插入图片描述
为了方便交互,需要一个数据结构来记录勾选状态:

QVector<QPair<bool,bool>> m_checked{};  //储存某个位置是否被勾选

根据数据设置条目勾选状态:

    case Qt::CheckStateRole:
    {
        if(index.column()==0)
        {
            if(m_checked.at(index.row()).first) return Qt::Checked;
            else return  Qt::Unchecked;
        }
        else {
            if(m_checked.at(index.row()).second) return Qt::Checked;
            else return  Qt::Unchecked;
        }
}

根据用户选择记录勾选状态:

        case Qt::CheckStateRole:
        {
            auto cheked = m_checked.at(index.row());
            if(index.column()==0)
            {
               m_checked.replace(index.row(),QPair<bool,bool>(value.toBool(),cheked.second));
            }
            else
            {
                m_checked.replace(index.row(),QPair<bool,bool>(cheked.first,value.toBool()));
            }
            emit dataChanged(index, index, QVector<int>() << role);
            return true;
        }

为了测试,假设勾选框勾上,设置字体为粗体,如果没有勾选设置为非粗体。对data之中的FontRole编写算法如下:

    case Qt::FontRole:
    {
        QFont font;
        if(index.column()==0? m_checked.at(index.row()).first:m_checked.at(index.row()).second)
        {
            font.setBold(true);
            return font;
        }
        else {
            return font;
        }
    }

编译运行代码,勾选几个条目测试代码效果:
在这里插入图片描述

那么需要对insertRows和removeRows做相应的修改。修改后用户模型的头文件代码如下:

#ifndef CUSTOMITEMMODEL_H
#define CUSTOMITEMMODEL_H

#include <QAbstractItemModel>
#include <QVector>
#include <QMap>

class CustomItemModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    explicit CustomItemModel(QObject *parent = nullptr);
    ~CustomItemModel();

    // Header:
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

    bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;

    // Basic functionality:
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const override;
    QModelIndex parent(const QModelIndex &index) const override;

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

    // Fetch data dynamically:
    bool hasChildren(const QModelIndex &parent = QModelIndex()) const override;

    bool canFetchMore(const QModelIndex &parent) const override;
    void fetchMore(const QModelIndex &parent) override;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    // Editable:
    bool setData(const QModelIndex &index, const QVariant &value,
                 int role = Qt::EditRole) override;

    Qt::ItemFlags flags(const QModelIndex& index) const override;

    // Add data:
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override;

    // Remove data:
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override;

public slots:
    void pushData(QString,int ); //向模型添加一个数据

private:
    QVector<QPair<QString,int>> *m_dataVector = nullptr; //新建一个储存数据的序列对象,每个元素(行)两个值,一个储存姓名、一个储存年龄
    QList<QString> m_headName;  //储存表头名称
    QVector<QPair<bool,bool>> m_checked{};  //储存某个位置是否被勾选
};

#endif // CUSTOMITEMMODEL_H

用户模型源文件代码如下:

#include "customitemmodel.h"
#include <QDebug>
#include <QColor>
#include <QFont>
#include <iostream>

CustomItemModel::CustomItemModel(QObject *parent)
    : QAbstractItemModel(parent)
      ,m_dataVector(new QVector<QPair<QString,int>>{})
{
    m_dataVector->push_back({"Bob",30});
    m_headName = {"Name","Age"};
    m_checked.append(QPair<bool,bool>(false,false));
}

CustomItemModel::~CustomItemModel()
{
    if(m_dataVector) {m_dataVector->clear();delete m_dataVector;m_dataVector=nullptr;}
}

QVariant CustomItemModel::headerData(int section, Qt::Orientation orientation, int role) const
{

    if(role!=Qt::DisplayRole)
        return QVariant();
    if(orientation==Qt::Vertical)
        return QVariant(section);
    if(orientation==Qt::Horizontal)
    {
        if(section==0) return QVariant(m_headName[0]);
        if(section==1) return QVariant(m_headName[1]);
    }
    return QVariant();
}

bool CustomItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
{
    if (value != headerData(section, orientation, role)) {
        if(role!=Qt::EditRole) return false;
        if(orientation==Qt::Vertical) return false;
        if(section==0) m_headName[0]= value.toString();
        if(section==1) m_headName[1]=value.toString();
        emit headerDataChanged(orientation, section, section);
        return true;
    }
    return false;
}

QModelIndex CustomItemModel::index(int row, int column, const QModelIndex &parent) const
{
    if(row>m_dataVector->size()-1 || row < 0) return  QModelIndex();
    if(column>1 || column<0) return QModelIndex();
    return createIndex(row,column);
}

QModelIndex CustomItemModel::parent(const QModelIndex &index) const
{
    // FIXME: Implement me!
    return QModelIndex();
}

int CustomItemModel::rowCount(const QModelIndex &parent) const
{
    return m_dataVector->size();
}

int CustomItemModel::columnCount(const QModelIndex &parent) const
{
    return 2;
}

bool CustomItemModel::hasChildren(const QModelIndex &parent) const
{
    return false;
}

bool CustomItemModel::canFetchMore(const QModelIndex &parent) const
{
    return false;
}

void CustomItemModel::fetchMore(const QModelIndex &parent)
{
    // FIXME: Implement me!
}

QVariant CustomItemModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(index.row()>m_dataVector->size()-1 || index.row()<0 || index.column()<0  ||index.column()>1)
        return QVariant();
    switch(role)
    {
    case Qt::DisplayRole:
    {
        if(index.column()==0)
        {
            QString name = m_dataVector->at(index.row()).first;
            return QVariant(name);
        }
        if(index.column()==1)
        {
            int age = m_dataVector->at(index.row()).second;
            return QVariant(age);
        }
        break;
    }
    case Qt::TextAlignmentRole:
    {
        return Qt::AlignCenter;
    }
    case Qt::DecorationRole://The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)
    {
        if(index.column()==0) return QColor(255,0,0,255); //Name显示 红色
        if(index.column()==1) return QColor(0,255,0,255); //Age列显示绿色
    }
    case Qt::ToolTipRole:
    {
        return QVariant();
    }
    case Qt::SizeHintRole:
    {
        return QVariant();
    }
    case Qt::FontRole:
    {
        QFont font;
        if(index.column()==0? m_checked.at(index.row()).first:m_checked.at(index.row()).second)
        {
            font.setBold(true);
            return font;
        }
        else {
            return font;
        }
    }
    case Qt::BackgroundRole:
    {
        return QVariant();
    }
    case Qt::ForegroundRole:
    {
        return QVariant();
    }
    case Qt::CheckStateRole:
    {
        if(index.column()==0)
        {
            if(m_checked.at(index.row()).first) return Qt::Checked;
            else return  Qt::Unchecked;
        }
        else {
            if(m_checked.at(index.row()).second) return Qt::Checked;
            else return  Qt::Unchecked;
        }
    }
    case Qt::UserRole+1:  //用户自定义角色 预留
    {
        return QVariant();
    }
    default:
        return QVariant();
    }
}

bool CustomItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (data(index, role) != value)
    {
        switch (role)
        {
        case Qt::EditRole:
        {
            QString name = m_dataVector->at(index.row()).first;
            int age = m_dataVector->at(index.row()).second;
            if(index.column()==0)
            {
                QPair<QString,int> pair(value.toString(),age);
                m_dataVector->replace(index.row(),pair);
            }
            if(index.column()==1)
            {
                QPair<QString,int> pair(name,value.toInt());
                m_dataVector->replace(index.row(),pair);
            }
            emit dataChanged(index, index, QVector<int>() << role);
            return true;
        }
        case Qt::CheckStateRole:
        {
            auto cheked = m_checked.at(index.row());
            if(index.column()==0)
            {
               m_checked.replace(index.row(),QPair<bool,bool>(value.toBool(),cheked.second));
            }
            else
            {
                m_checked.replace(index.row(),QPair<bool,bool>(cheked.first,value.toBool()));
            }
            emit dataChanged(index, index, QVector<int>() << role);
            return true;
        }
        default:
            return false;
        }
    }
    return false;
}

Qt::ItemFlags CustomItemModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;

    return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable |Qt::ItemIsUserCheckable; // FIXME: Implement me!
}

bool CustomItemModel::insertRows(int row, int count, const QModelIndex &parent)
{
    if(row<0 || row>m_dataVector->size() || count<1) return false;
    beginInsertRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
        QPair<QString,int> newPair{};
        QPair<bool,bool> state{false,false};
        m_dataVector->insert(row+i,newPair);
        m_checked.insert(row+i,state);
    }
    endInsertRows();
    return true;
}

bool CustomItemModel::insertColumns(int column, int count, const QModelIndex &parent)
{
    beginInsertColumns(parent, column, column + count - 1);
    endInsertColumns();
    return false;
}

bool CustomItemModel::removeRows(int row, int count, const QModelIndex &parent)
{
    if(row<0 || row>m_dataVector->size() || count<1 ) return false;
    beginRemoveRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
        if(m_dataVector->size()==0) return true;  //判断是否已经删除完,如果已完,提前退出
        m_dataVector->remove(row);
        m_checked.remove(row);
    }
    endRemoveRows();
    return true;
}

bool CustomItemModel::removeColumns(int column, int count, const QModelIndex &parent)
{
    beginRemoveColumns(parent, column, column + count - 1);
    // FIXME: Implement me!
    endRemoveColumns();
    return false;
}

void CustomItemModel::pushData(QString name, int age)
{
    m_dataVector->push_back(QPair<QString,int>(name,age));
    m_checked.push_back(QPair<bool,bool>(false,false));
    emit dataChanged(
        createIndex(m_dataVector->size()-1,0),
        createIndex(m_dataVector->size()-1,1),
        QVector<int>() << Qt::DisplayRole<<Qt::CheckStateRole
                     );
}

欢迎同好沟通交流,批评指正,欢迎关注我的公号:不如起而行之

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt系列文章之 QAbstractItemModel(下) 的相关文章

  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • 使 QLabel 的像素图透明

    我有一个带有 QLabel 和像素图的主窗口 我想让它透明 或不那么不透明 我正在使用下面的代码 ui gt label gt setAttribute Qt WA TranslucentBackground ui gt label gt
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • 使用 QNetworkAccessManager 的 Qt 控制台应用程序

    我正在尝试写一个Qt调用网络服务的应用程序 这是一个控制台应用程序 url 将作为命令行参数传入 我搜索了例如http程序在Qt并找到这个链接 http qt project org doc qt 5 qnetworkaccessmanag
  • Qt 相当于 .NET 数据绑定吗?

    Qt 中是否有相当于 NET 数据绑定的功能 我想使用引用数据库中特定实体的 QString 填充一些组合框和其他小部件 但是 如果我可以将数据绑定到这些字符串 而不是基于新的组合框选择再次查询数据库 或者基于构建我自己的将使用 QStri
  • Qt:将数字转换为 QString、QVariant 或 QString::number 哪个更好

    我只是好奇 比方说 我需要在控制台中输出一个数字 代码是 include
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs
  • 当选项卡到另一个组件位置时,QML 中相应的滚动

    我想做的是 如果我从TextField到另一个组件 aComboBoxwtv 我希望滚动能够适应这一点 当我认为这非常重要时 当我执行连续选项卡时 我会转到滚动视图显示的内容下方的控件 一个例子是 假设我在这里 now i do 2 tab
  • QML 圆规

    我目前正在创建一个虚拟仪表板 我想获得针后面的进度条类型 如以下链接所示 https forum qt io topic 89307 qml circular gauge styling needle trailing colour glo
  • QtCreator:找不到有效的套件

    在 Windows 7 上仅安装了 IDE 我想创建一个纯 C 项目 非 QT 项目 但是我收到错误 未找到有效的套件 当我单击 选项 gt 套件 时 我看到桌面 默认 套件 并且没有显示任何错误 我收到错误是因为我没有安装 Qt 库吗 如
  • 如何找到位于给定 (X,Y) 位置的 DOM 节点? (命中测试)

    我有 HTML 文档中一个点的坐标 X Y 如何确定这些坐标处的 DOM 节点是什么 一些想法 是否有我错过的 DOM 命中测试函数 它需要一个点 X Y 并返回那里的 DOM 元素 有没有一种有效的方法来遍历 DOM 元素树来查找包含元素
  • qtcreator中C++14的编译

    我有一个 qt 项目 其中包含以下部分C 14 最近 我改变了我的 ubuntu 发行版 现在我有 16 04 LTS 并且安装了 Qt Creator 4 02 建于 6 月 13 日 为了启用C 14编译 我放入项目文件中 QMAKE
  • Qt,颜色选择器对话框?

    Qt 是否有如下所示的颜色选择器对话框 它还需要有一个 OnColorChanged 信号 当选定的颜色发生变化时会调用该信号 我想在他们改变颜色时提供实时预览 这就是原因 使用谷歌我只能找到这个 它是一个圆边上的三角形 我个人认为它看起来
  • 如何释放Qthread对象的内存?

    我做过这样的事情 in the mainwindow s constructor QThread thr new QThread soundWorker work new soundWorker connect this SIGNAL pl
  • 超越堆栈采样:C++ 分析器

    黑客的故事 日期是 2010 年 2 月 12 日 圣诞节前的日子已经过去了 作为一名 Windows 程序员 我几乎遇到了一个主要障碍 我一直在使用 AQTime 我尝试过 sleepy shiny very sleepy 就在我们说话的
  • Row 和 RowLayout 有什么区别?

    这按预期工作Row 但不与RowLayout 为什么 两者有什么区别 ApplicationWindow title Testing width 640 height 480 RowLayout Row anchors fill paren

随机推荐

  • 软件测试 白盒测试

    实验三 白盒测试 1 实验目的 掌握白盒测试方法及会使用Junit进行测试 2 实验内容 一 使用 java 实现如下功能的程序 输入三条边 a b c 满足 0 lt a lt 200 0 lt b lt 200 0 lt c lt 20
  • 栈的顺序与链式存储结构及实现(C语言)

    目录 1 栈的定义和特点 2 栈的表示和操作的实现 2 1 顺序栈的表示和实现 2 1 1 栈的顺序存储表示 2 1 2 顺序栈的定义与基本操作函数源码 2 2 链栈的表示和实现 2 2 1 栈的链式存储表示 2 2 2 链栈的定义与基本操
  • 阿晨的运维笔记

    开始部署之前 建议先按照Ubuntu切换到国内镜像源操作一下 能省下大把宝贵时间 Kafka的分布式调度是依赖Zookeeper来完成的 所以还没有部署Zookeeper的小伙伴 可以参考我的另一篇博客阿晨的运维笔记 Ubuntu部署Zoo
  • 如何花钱做引流?如何推广付费引流?付费引流有哪些?

    获取流量最直接最快的方式是什么 肯定是付费推广了 只不过付费对于大部分朋友来说是个盲区 只看到了付钱换流量这个表面操作 却没去注意在这个背后 也是一样有很多需要思考的问题 那我们今天就说说如何花钱来做引流 一 搜索流量 也就是大家所熟知的竞
  • curl 忽略https的ssl的证书验证

    今天使用curl 测试url请求出现了需要ssl证书的验证 curl的用法
  • C++ 注释【菜鸟教程】

    程序的注释是解释性语句 您可以在 C 代码中包含注释 这将提高源代码的可读性 所有的编程语言都允许某种形式的注释 C 支持单行注释和多行注释 注释中的所有字符会被 C 编译器忽略 C 注释一般有两种 一般用于单行注释 一般用于多行注释 注释
  • 机器学习之交叉验证(cross-validation,CV)

    机器学习之交叉验证 cross validation CV 人和计算机的主要区别在于人可以对问题进行思考 而计算机只会计算 从AI角度来看 人们将大量无序嘈杂的数据简单清洗之后喂 feed 给计算机 训练使其得出含参数的模型 在模型的基础上
  • Pandas 模块-操纵数据(7)-检测是否重复 .duplicated()

    目录 7 检测是否重复 duplicated 7 1 duplicated 语法 7 1 1 语法结构 7 1 2 参数说明 7 2 duplicated 范例 7 2 1 subset 使用 7 2 2 keep 使用 7 检测是否重复
  • 深度学习与智能故障诊断学习笔记(一)——故障诊断体系介绍

    1 引言 智能故障诊断 IFD 是指将机器学习理论 如人工神经网络 ANN 支持向量机 SVM 和深度神经网络 DNN 应用于机器故障诊断 这种方法利用机器学习理论 从采集的数据中自适应地学习机器的诊断知识 而不是利用工程师的经验和知识 具
  • 4.9枚举 & 注解 & 反射

    1 枚举 1 1 简介 JDK1 5引入了新的类型 枚举 在JDK1 5 之前 我们定义常量都是 public static fianl 很难管理 枚举 可以把相关的常量分组到一个枚举类型里 而且枚举提供了比常量更多的方法 用于定义有限数量
  • Diff算法—前端框架的基石

    Diff算法 前端框架的基石 一 Diff算法 一 Diff算法 什么是Diff算法 比较差异算法 找出必须要更新的DOM的办法 比较什么差异 DOM树差异 如何比较 用js模拟真实dom virtual dom 虚拟DOM 比较DOM树变
  • java.lang.OutOfMemoryError: Java heap space

    项目部署在服务器上 上传图片的时候出现的问题 记录下问题 java long OutOfMemoryError java heap space 系统内存不足 修改启动参数 echo start http service nohup java
  • 【Android -- 写作工具】Markdown 生成目录

    1 前言 目录是文章内容的整体索引 是文章结构的最直观表现形式 Markdown 为生成目录提供了快捷方式 大大降低了文章目录的编排复杂度 2 语法详解 2 1 目录的自动生成 在 Markdown 中 自动生成目录非常简单 只需要在恰当的
  • flutter控件之弹出菜单PopupmenuButton控件

    PopupMenuButton控件即弹出菜单控件 点击控件会出现菜单 import package flutter material dart class MenusDemo extends StatefulWidget override
  • git如何上传本地项目

    初始化设置 在安装Git之后 需要对用户名和邮箱进行设置 这个操作只需要进行一次 git config global user name lt 用户名 gt git config global user email lt 电子邮件 gt 新
  • Bootstrap框架(组件)

    目录 前言 一 组件 1 1 字体图标 1 2 下拉菜单组件 1 2 1 基本下拉菜单 1 2 2 按钮式下拉菜单 1 3 导航组件 1 3 1 选项卡导航 1 3 2 胶囊式导航 1 3 3 自适应导航 1 3 4 下拉菜单导航 1 3
  • 提高PHP性能的几个技巧

    分享关于在PHP编程言语中 如何进步效率问题 常常同样的功用 不一样的代码 出来的效率常常大不一样 博主总结以下几点分享给大家 1 用单引号替代双引号来包含字符串 这样做会更快一些 由于PHP会在双引号包围的字符串中搜索变量 单引号则不会
  • Linux文件编程实现复制(cp)命令。

    复制基本思路 1 打开第一个文件 2 读取第一个文件的内容 3 打开 创建第二个文件 4 将文件写入进去 源代码 include
  • openGauss学习笔记-28 openGauss 高级数据管理-NULL值

    文章目录 openGauss学习笔记 28 openGauss 高级数据管理 NULL值 28 1 IS NOT NULL 28 2 IS NULL openGauss学习笔记 28 openGauss 高级数据管理 NULL值 NULL值
  • Qt系列文章之 QAbstractItemModel(下)

    本文紧接着上一文介绍如何对用户模型剩下的类进行实现 并将其集成到视图并显示出来 QAbstractItemModel insertRows int row int count const QModelIndex parent 该函数实现一次