Qt创建左目录树右表格时出现的问题

lwei2 2024-03-08 13:38:25

如题,想做一个左目录树右表格,具体如下:
 

 左目录由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。各位大佬,请问由什么办法能够上述问题吗?欢迎各位大佬们指点一二,小弟感激不尽,在线等!!!

...全文
915 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
彩阳 04-02
  • 打赏
  • 举报
回复

第40行的QModelIndex不复用。因为它们的model不一样。
更好的办法就是自己发送一个filePath出去,然后交给tableView的FileSystemModel翻译成它的QModelIndex再设给tableView,这样会合适一些。

lwei2 04-02
  • 举报
回复
@彩阳 哦哦,多谢指点,我试试看!

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧