一、QListWidget、QTableWidget和QTreeWidget

QTableWidget的item默认是可以编辑,其他两个的item默认是不可编辑。如果要将QTableWidget设置成不可编辑,可以使用

tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

则tablewidget的所有item都是不可编辑的;

QListWidget和QTreeWidget默认是不可编辑的,如果想要将item变成可以编辑的,可以简单地将item设置成可以编辑的,如下所示

        item = new QTreeWidgetItem(parent);
item->setFlags(Qt::ItemIsEditable|item->flags());

则整个的该item是可以编辑的。如果只是想某一列可以编辑,其中一种方法是使用信号和槽。双击可编辑的方式;

    treeWidget = new QTreeWidget;
treeWidget->setColumnCount();



connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(editFileFilter(QTreeWidgetItem*,int))); // slot
void SettingsViewer::editFileFilter(QTreeWidgetItem *item, int column)
{
if (column == )
item->setFlags(Qt::ItemIsEditable | item->flags());
else
item->setFlags(item->flags() & ~(Qt::ItemIsEditable) );
}

如上所示自己编写一个slot,当双击的时候触发设置标记

二、QStringListModel、QDirModel

QStringListModel

通过QModelIndex index = model->index(row);指定的第几行获得对应的QModelIndex;

要删除行,可以通过

    model->removeRows(listView->currentIndex().row(), );
model->removeRow(listView->currentIndex().row());

第一个要在指定的行号后面增加对应删除多少行;下面则一次只能删除一行。ps:上面两行代码都是删除一行;

可以将model装进listview里面

    model = new QStringListModel(this);
model->setStringList(leaders); listView = new QListView;
listView->setModel(model);
listView->setEditTriggers(QAbstractItemView::AnyKeyPressed
|QAbstractItemView::DoubleClicked);

第二行将QStringList leaders的数据装进model;然后将model给listview来显示(如第四行代码所示)

QDirModel

    model = new QDirModel;
model->setReadOnly(false);
model->setSorting(QDir::DirsFirst|QDir::IgnoreCase|QDir::Name); treeView = new QTreeView;
treeView->setModel(model);

QDirModel装载的是文件目录;可以对文件和目录进行操作;

QModelIndex index(const QString &path, int column = ) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;

文件查找有两种方式来获取QModelIndex; 如下所示

QModelIndex index = model->index(QDir::currentPath());

文件删除

    if (model->fileInfo(index).isDir())
ok = model->rmdir(index);
else
ok = model->remove(index);

如果是目录则需要用rmdir的方式进行删除;否则通过remove进行删除文件,如上所示

创建文件夹

if (!model->mkdir(index, dirName).isValid())

QSortFilterProxyModel

为model提供了代理;可以不操作model的数据,view只通过该代理类进行显示;该代理相对model增加了过滤器QRegExp;指定column还有sort,increase或者decrease等;其中sort也可以自定义排序;

    virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;

通过重写此代码进行重新自定义排序;

    virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const;

可以通过重写这两个函数进行过滤指定的source_row是否需要显示,指定的source_column是否需要显示;

bool HideColumnProxy::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
{
if(source_column >= )
return false;
return true;
}

如上,则只显示从0~2的column号

三、QAbstractTableModel

当子类化QAbstractTableModel时,必须实现rowCount(),columnCount,和data()函数。因为在QAbstractItemModel中,该三个函数为纯虚函数。QAbstractItemModel另外的两个纯虚函数在QAbstractTableModel中已经被实现了,无需一定要再重写。

当需要自定义每列或者每行的行号时,则需要重新实现函数headerData函数,例如:

QVariant CurrencyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
return currencyAt(section);
}

当需要更新列表的数据的时候,在qt4使用reset()函数,但是在Qt5中,却没有该函数;通过查看QAbstractItemModel的头文件可以看到:

#if QT_DEPRECATED_SINCE(5,0)
QT_DEPRECATED void reset()
{
beginResetModel();
endResetModel();
}
#endif void beginResetModel();
void endResetModel();

则要更新的话,需要自己用begin和end函数替代reset函数。

当需要更新数据的时候,可以重写该函数

    Q_INVOKABLE virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);

如下例子

bool CityModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && index.row() != index.column()
&& role == Qt::EditRole) {
int offset = offsetOf(index.row(), index.column());
distances[offset] = value.toInt(); QModelIndex transposedIndex = createIndex(index.column(),index.row()); emit dataChanged(index, index);
emit dataChanged(transposedIndex, transposedIndex); return true;
} return false;
}

首先index必须有效,其他两个判断则是根据实际情况进行判断的。

然后createIndex则是因为当index改变的时候,另一个index也需要改变,所以这里create了一个index;因为当在指定的范围内发生改变的时候需要emit dataChanged;因为index跟transposedIndex都发生了改变,所以都需要emit;

This signal is emitted whenever the data in an existing item changes.

返回的true或者false表示设置数据成功与否。

问题及解决:

在重写QDialog的done函数的时候,忘记在函数的最后调用父类的done函数,导致窗口无法关闭;只能通过杀死进程的方式;QDialog::done(result);
















Qt Gui 第十章的更多相关文章

  1. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  2. 第八章 Qt GUI之对话框使用

    第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...

  3. 自己的Qt GUI 项目+vs2013+opencv+caffe环境配置

    由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁.很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务.今天我主要讲的关于"在自己的项目中配 ...

  4. GNU Radio下QT GUI Tab Widget的使用方法

    期望显示出的效果: 即将要显示的图放在各自的标签页中. 整体框图: 具体设置: QT GUI Tab Widget的设置: 其中 ID改为自己想改的,这里我写的是display GUI Hint所代表 ...

  5. QT GUI @创建新的工程

    开发环境: Qt 4.5 Qt Creator 1.3.0 新工程创建步骤: 1. 单击运行Qt Creator,进入欢迎页面.选择"File" -> "New F ...

  6. 独立线程中实现QT GUI

    在网上搜集的资料: http://www.qtcentre.org/threads/16552-Starting-QT-GUI-in-a-seperate-Threadhttp://stackover ...

  7. 基于Qt Gui的Led控制显示程序

    基于arm + linux的嵌入式软件开发,基本上的内容主要是:u-boot的移植,kernel的裁剪和相关驱动程序的设计,root-fs的制作,应用程序的设计,其中,应用程序主要包含两方面的内容:G ...

  8. Qt GUI@学习日志

    day 1: Qt中类: 理解一个类最好还是从其类代码实现上看. 由此图可看出需要好好研究那几个重要的类:Qt/QEvent/QObject/QWidget/. QApplication: (比较复杂 ...

  9. QT GUI总结

      QT提供了设计师工具,可以很方便的使用鼠标拖拽的方式绘制界面.绘制完毕后自动生成一个界面的.h文件(如ui_mainwindow.h),其中含有一个自动生成的Ui_MainWindow类,这个类中 ...

随机推荐

  1. liunx 上守护进程的设置

    */2 * * * * root /data/autojobsh/auto_ck_pms_10250.sh */2 * * * * root /data/autojobsh/auto_ck_ipms_ ...

  2. JAVA 对守护线程的理解

    1.在start之前,setDaemon. 该现场就成为守护线程了. 2.守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. 示例代 ...

  3. 简单ts文件结构

    一.ts文件结构 DEMO{ 1. .vscode:特有文件夹,调试的配置文件,启动浏览器 2. Js:放ts编译后的文件,不管 3. Ts:放ts文件,敲代码 4. tsconfig.json:ts ...

  4. 杭电-------2043密码(C语言写)

    #include<stdio.h> #include<string.h> ]; ] = { '~','!','@','#','$','%','^' }; ] = { }; in ...

  5. VFP的数据策略:高级篇

    VFP的数据策略:高级篇 引语 在“VFP中的数据策略:基础篇”一文中,我们研究了VFP应用程序中访问非VFP数据(如SQL Server)的不同机制:远程视图.SQL Passthrough.ADO ...

  6. C++ Primer抄书笔记(二)——变量和基本类型(下)

    四.const限定符[引用/指针/顶层/常量表达式] const对象值不变,必须初始化,能完成此type的大部分operation. 一般,多文件独立变量,编译初始化仅文件内有效: 除非,(条件:初值 ...

  7. apue 外传

    先上目录 chapter 3 [apue] dup2的正确打开方式 chapter 10 [apue] 等待子进程的那些事儿 chapter 14 [apue] 使用文件记录锁无法实现父子进程交互执行 ...

  8. Window 系统 Excel 同时打开两个Excel 文件

    问题 我们在使用 Excel 的时候,经常需要打开多个 Excel 文件,但是默认的话我们是只打开一个窗口的.这样不便于我们操作两个 Excel . 解决办法 下载这个补丁进行安装,下载链接 http ...

  9. 树莓派点亮LED灯需要几行代码?3行。小孩子都能学会

    目录 点亮LED灯 硬件连接 代码 闪烁的LED灯 呼吸灯 其他 点亮LED灯 硬件连接 找一个LED灯,连接如上图,注意长短引脚,经过这些年的狂轰乱炸,大家对于这个应该不漠视,毕竟Arduino都进 ...

  10. java 关于xlsx(xls) 和 csv 文件的数据解析

    1.适用于xlsx 和 xls  <!--xlsx和xls文件pom依赖--> <dependency> <groupId>org.apache.poi</g ...