16,759
社区成员




如题,想做一个左目录树右表格,具体如下:
左目录由QTreeView和重定义模型QFileSystemModel组成,具体代码如下:
FileSystemModel::FileSystemModel(QObject *parent)
: QFileSystemModel(parent)
{
this->setRootPath(QString(""));
this->setFilter(QDir::Drives | QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Dirs | QDir::Hidden | QDir::System);
}
int FileSystemModel::columnCount(const QModelIndex &parent) const
{
return 1;
}
QVariant FileSystemModel::data(const QModelIndex &index, int role) const
{
if(index.isValid())
{
if(role == Qt::DecorationRole)
{
return QVariant();
}
else if(role == Qt::DisplayRole)
{
if(index.column() == 0)
{
if(this->fileInfo(index).isRoot()) //判断是否是根结点
{
return QDir::toNativeSeparators(QString("%1").arg(this->fileInfo(index).absolutePath()));
}
}
}
}
return QFileSystemModel::data(index, role);
}
右表格由QTableView和重定义模型QFileSystemModel组成,具体代码如下:
TbFileSystemModel::TbFileSystemModel(QObject *parent)
: QFileSystemModel(parent)
{
}
QVariant TbFileSystemModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
{
switch (section) {
case 0:
return QString("名称");
case 1:
return QString("日期");
case 2:
return QString("类型");
case 3:
return QString("大小");
}
}
return QVariant();
}
QVariant TbFileSystemModel::data(const QModelIndex &index, int role) const
{
if(index.isValid())
{
if(role == Qt::DecorationRole)
{
if(index.column() == 0)
{
if(isDir(index))
return QIcon(":/res/folder.png");
else
return QIcon(":/res/file.png");
}
}
}
return QFileSystemModel::data(index, role);
}
主窗口具体代码如下:
m_splitter = new QSplitter(Qt::Horizontal);
//初始化左目录树
m_treeView=new QTreeView(this);
m_fsModel = new FileSystemModel(this);
m_sortModel = new QSortFilterProxyModel(this);
m_sortModel->setSourceModel(m_fsModel);
m_sortModel->setSortCaseSensitivity(Qt::CaseInsensitive);
m_sortModel->sort(0, Qt::AscendingOrder);
m_treeView->setModel(m_sortModel);
m_treeView->setHeaderHidden(true);
m_treeView->hideColumn(1);
m_treeView->hideColumn(2);
m_treeView->hideColumn(3);
m_treeView->collapseAll();
m_treeView->setFocusPolicy(Qt::NoFocus);
m_splitter->addWidget(m_treeView);
m_tableView = new QTableView(this);
m_tbModel = new TbFileSystemModel;
m_tableView->setModel(m_tbModel);
m_tableView->horizontalHeader()->setSectionsClickable(false);
m_tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
m_tableView->horizontalHeader()->setStretchLastSection(true);
m_tableView->horizontalHeader()->setMinimumSectionSize(25);
m_tableView->horizontalHeader()->setFont(QFont("Microsoft Yahei", 9, QFont::Normal));
m_tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {color: #707070; border-bottom:none !important;}");
m_tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);
m_tableView->setColumnWidth(0, 200);
m_tableView->setColumnWidth(1, 140);
m_tableView->setColumnWidth(2, 75);
m_tableView->setShowGrid(false); //去掉网格线
m_tableView->setFocusPolicy(Qt::NoFocus); //去掉选中虚线
m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
m_splitter->addWidget(m_tableView);
connect(m_treeView, SIGNAL(clicked(QModelIndex)), m_tableView, SLOT(setRootIndex(QModelIndex)));
运行后,由于左目录树和右表格数据模型不一样,所以报错:QAbstractItemView::setRootIndex failed : index must be from the currently set model。各位大佬,请问由什么办法能够上述问题吗?欢迎各位大佬们指点一二,小弟感激不尽,在线等!!!