QT:“实例”模型/视图类使用
例CH801 实现一个简单的文件目录浏览器,完成效果如图8.2所示:
创建工程DirModeEx,
N:文件>>新建文件或项目,
项目选 "Qt Widgets Application" 下一步,名称为 DirModeEx ,下一步; Build System=qmake,下一步;
Class Name 为 MainWIndow, Base class 为QMainWIndow ,取消 “Generate form”, 下一步。。。一直到完成。
在源文件main.cpp中的具体代码如下:
#include "mainwindow.h" #include <QApplication> #include <QAbstractItemModel> #include <QAbstractItemView> #include <QItemSelectionModel> #include <QDirModel> #include <QTreeView> #include <QListView> #include <QTableView> #include <QSplitter> #include <QAbstractItemView> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDirModel model; /* 新建三种不同的VIEW对象,以便文件目录可以以三种不同的方式显示 */ QTreeView tree; QListView list; QTableView table; tree.setModel(&model); list.setModel(&model); table.setModel(&model); QItemSelectionModel *itemSelectModel = new QItemSelectionModel(&model); tree.setSelectionModel(itemSelectModel); list.setSelectionModel(tree.selectionModel()); table.setSelectionModel(tree.selectionModel()); // 双击 树目录,同时将结果显示在列表、表结构视图中 QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)), &list, SLOT(setRootIndex(QModelIndex)) ); QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table, SLOT(setRootIndex(QModelIndex))); QSplitter *splitter = new QSplitter; splitter->addWidget(&tree); splitter->addWidget(&list); splitter->addWidget(&table); splitter->setWindowTitle(QObject::tr("Model/View")); splitter->show(); // MainWindow w; // w.show(); return a.exec(); }
其中与书中
tree.setSelectionModel(QAbstractItemView::MultiSelection);
改为
QItemSelectionModel *itemSelectModel = new QItemSelectionModel(&model);
tree.setSelectionModel(itemSelectModel);
解决 Error: cannot initialize a parameter of type ‘QItemSelectionModel *’ with an rvalue of type ‘QAbstractItemView::SelectionMode’ qtreeview.h 的出错问题。
以上开发环境:
QT Creator 4.11.1;
Base on Qt 5.14.2 (MSVC 2017 ,32bit ) .
优质生活从拆开始