QT_tablewidget

qt tablewidget

2018-6-11

基于qt的tablewidget 实现文件系统的模拟,treewidget实现树形目录

配置:mac 10.13。 Qt 5.9

参考博文:https://www.cnblogs.com/zhoug2020/p/3789076.html

//前面一部分基本都是按照这个博主写的来的,后面基本都是随便找的🌚🙈,这里当总结一下,因为不这样下次依旧不记得咋整。。。

文件系统提供的操作:

    • 格式化 报错了。。。吐血。。🙃,调了半天了,太难过了,我还是洗洗睡了吧
    • 创建子目录。 ok😃
    • 删除子目录。 Ok
    • 显示目录。 ok
    • 更改当前目录。 Ok,一点树形目录就可以啦
    • 创建文件。ok
    • 打开文件。ok
    • 关闭文件。还没写,ok?直接关就好了啊。。。
    • 写文件。 需要界面,害没写
    • 读文件。 同上,两功能一起,害没写,关写了个界面。。丑到哭泣,美工弱鸡哭唧唧
    • 删除文件。 Ok
    • 属性界面,害没写,o得k?

使用tablewidget 实现: 好多功能,看着心疼=. =

操作表单,(添加删除行 ✔️

双击某行打开该行文件

右键菜单 ✔️

打开某行重命名 ✔️

嗷嗷!重命名还么有写成功!

1. qt tablewidget初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//对tablewidgetçš„åˆå§‹åŒ–
ui->tableWidget->setColumnCount(4);
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(150);
//设置表头
QStringList header;
header<<tr("å称")<<tr("修改日期")<<tr("大å°")<<tr("ç§ç±»");
ui->tableWidget->setHorizontalHeaderLabels(header);
//设置表å称加粗
QFont font = ui->tableWidget->horizontalHeader()->font();
font.setBold(true);
ui->tableWidget->horizontalHeader()->setFont(font);

ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //设置充满表宽度
ui->tableWidget->horizontalHeader()->sectionResizeMode(QHeaderView::ResizeToContents);
//ui->tableWidget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
ui->tableWidget->verticalHeader()->setDefaultSectionSize(20); //设置行高
ui->tableWidget->setFrameShape(QFrame::NoFrame);
ui->tableWidget->setShowGrid(false);
ui->tableWidget->verticalHeader()->setVisible(false);
ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget->setEditTriggers(QAbstractItemView::SelectedClicked);
ui->tableWidget->horizontalHeader()->resizeSection(0,150);
ui->tableWidget->horizontalHeader()->setFixedHeight(25);

ui->tableWidget->setStyleSheet("selection-background-color:lightblue;");
ui->tableWidget->setAlternatingRowColors(true);
ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightgray;}");

ui->tableWidget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");

ui->tableWidget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");

ui->tableWidget->horizontalHeader()->setHighlightSections(false);

什么鬼什么鬼

2. 创建目录文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
QCursor cur = this->cursor();
QMenu* popMenu = new QMenu(this);
QPoint point = QCursor::pos();
QTableWidgetItem *item = ui->tableWidget->itemAt(point);

popMenu->addAction(rMenu.action_open);
popMenu->addAction(rMenu.action_rename);
popMenu->addSeparator();
popMenu->addAction(rMenu.action_delete);
popMenu->addAction(rMenu.action_atrribute);
popMenu->addAction(rMenu.action_flush);
popMenu->addSeparator();
popMenu->addAction(rMenu.action_create_folder);

//设置快æ·é”® 这就是我坚持用英文写注释的原因= =
rMenu.action_open->setShortcut(QKeySequence::Open);
rMenu.action_create_folder->setShortcut(QKeySequence::New);
rMenu.action_flush->setShortcut(QKeySequence::Refresh);
rMenu.action_delete->setShortcut(QKeySequence::Delete);

popMenu->exec(QCursor::pos());
event->accept();
  • Connect 方法需要写在ui初始化函数里,写在成员函数里会被多次唤醒导致一些奇奇怪怪的东西?

3. 右键菜单创建

1
2
3
auto rootItem = new     QTreeWidgetItem(ui>treeWidget,QStringList(“myFile"));
rootItem->setIcon(0,folderIcon);
itemNode.insert(root,rootItem);

对于tablewidget 表的初始化,设置表头表的格式等等

2018.6.20

//made by may 乱糟糟的重新整理一遍?

4. 文件相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    QDir dir = QDir::current();
if(!dir.exists("myFile")){
dir.mkdir("myFile");
} //mkdir为创建新的目录

if(root!=NULL){
qDebug()<<"i am so cool! "<<root->fileName;
}
QDir dir = QDir::current();
QString path = dir.absolutePath();
qDebug()<<path;
path = path + QDir::separator() + "myFile";
QFile* tempFile = new QFile;
dir.mkpath(path);
dir.setCurrent(path);
dir.setPath(path); //此处修改了当前路径


补充:file->setFileName(fileName) 为在该路径下创建一个新的文件,默认为txt,其实吧。。。。我也还不知道怎么创建其他形式的文件(比如ppt啥的,但是印象中mac好像都是要打开对应的app才能新建文件的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
QFileInfoList Widget::getFileList(QString path,node* root){
QDir dir(path);
QDir absDir = QDir::currentPath();
QString absPath = absDir.absolutePath();
qDebug()<<"absPath : "<<absPath;
QFileIconProvider fileIconPro;
QIcon icon;
QString fileName;
QFileInfoList fileInfoList = dir.entryInfoList();
dir.setSorting(QDir::Name);
QFileInfoList folderList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs|QDir::Files);
qDebug()<<"now path: "<<path;
for(int i = 0;i != folderList.size();i++){
QString name = folderList.at(i).absoluteFilePath();
if(absPath.contains('/')){
fileName = name.replace(path+"/","");
fileName = fileName.replace(absPath+"/",""); qDebug()<<"parent: "<<root->fileName<<" child: "<<fileName;
}else{
fileName = name.replace(path+"\\","");
fileName = fileName.replace(absPath+"\\",""); qDebug()<<"parent: "<<root->fileName<<" child: "<<fileName;
}
QFileInfo fileInfo = folderList.at(i);
QString type;
int permission;
if(fileInfo.suffix() == ""){
type = "folder";
permission = ReadOnly;
icon = fileIconPro.icon(QFileIconProvider::Folder);
}else{
type = fileInfo.suffix();
permission = Write;
icon = fileIconPro.icon(fileInfo);
}
int locate = 0;
FCB fcb(count++,fileName,type,fileInfo.created(),fileInfo.lastModified(),locate,fileInfo.size(),permission,0);
catalog.insert(root,fileName,fcb);
qDebug()<<"path :"<<name;
node* childRoot = catalog.find(root,fileName);
auto item = insertTreeItem(root,fileName,icon);
if(childRoot != NULL && item != NULL)
itemNode.insert(childRoot,item);
QFileInfoList childFileList = getFileList(name,childRoot);
fileInfoList.append(childFileList);
}
return fileInfoList;
}
  1. 图标获取,

    qt提供了相当方便的图标获取,但提供的图标有限,此处我只用了文本的和文件夹的,也还够用

  2. 创建新的文件或文件夹

  3. treewidget操作: 添加item

  4. 获取某一个文件下的所有文件getFileList

  5. 获取表单此时选择的列

  6. 右键菜单相应事件

//相当生气了辣鸡pages!我决定去官网下wps,再见pages,辣鸡玩意,表格绕文本能不能别叠起来,能不能别乱跑,操碎老妈子的心了,文档从开始到放弃啊啊啊

//md真好用

给咱来个🍰,啾咪