因为下个星期要中要做一个关于QTreeWidget相关的东西,特先学习相关点东西,明天就直接开始做了。
涉及如下技术:
1、在QTreeWidget中添加头(列头)。
2、往QTreeWidget中添加数据。
3、右键响应菜单栏。
4、关联信号与槽。
文件目录如下:
运行截图如下:
首先提供伪代码,再提供完整代码,最后提供整个项目的下载:
1、在QTreeWidget中添加头(列头)。
QStringList headers;
headers.append("Filename");
headers.append("Last Modified");
headers.append("Type");
headers.append("Size");
ui->treeWidget->setHeaderLabels(headers);
2、往QTreeWidget中添加数据。
QTreeWidgetItem* Widget::AddItem(const QString &filename
, const QString &last_modified
, const QString &type, int size
, QIcon icon
, QTreeWidgetItem *parent){
QTreeWidgetItem* item=new QTreeWidgetItem();
item->setText(0,filename);
item->setIcon(0,icon);
item->setText(1,last_modified);
item->setText(2,type);
item->setText(3,QString::number(size));
if(parent)
parent->addChild(item);
else
ui->treeWidget->addTopLevelItem(item);
return item;
}
调用如下:
this->AddItem("Qt5开发实例.txt","2016-01-15","text file",8512,icon_file);
this->AddItem("MFC开发实例.txt","2010-04-27","text file",4526,icon_file);
this->AddItem("Java开发实例.txt","2011-12-7","text file",1526,icon_file);
this->AddItem("C#开发实例.txt","2009-08-5","text file",7895,icon_file);
QTreeWidgetItem* item=AddItem("video","2018-03-25","folder",0,icon_folder);
AddItem("Qt管理系统开发视频.mp4","2018-03-25","mp4 file",4512,icon_file,item);
3、右键响应菜单栏。
int Widget::OnWidgetContextMeun(const QPoint &pt){
//当前选中项
QTreeWidgetItem *selected=ui->treeWidget->itemAt(pt);
//qDebug()<actionAdd);
if(selected){
menu.addAction(ui->actionRemove);
}
//显示菜单
menu.exec(ui->treeWidget->mapToGlobal(pt));
return 0;
}
int Widget::OnMenuAdd(){
QString msg=ui->treeWidget->currentItem()->text(0); //获取当前行的数据
//qDebug()<treeWidget->currentItem()->text(0); //获取当前行的数据
//qDebug()<
4、关联信号与槽。
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(OnWidgetContextMeun(QPoint)));
connect(ui->actionAdd,SIGNAL(triggered(bool)),this,SLOT(OnMenuAdd()));
connect(ui->actionRemove,SIGNAL(triggered(bool)),this,SLOT(OnMenuRemove()));
要注意如下几点:
右键时弹出快捷菜单(又称:上下文菜单)
步骤:
(1)设置菜单策略setContextMenuPolicy(Qt::CustomContextMenu);
(2) 关联信号customContextMenuRequested()在QWidget基类中有这个signal
(3) 事件处理(slot): 构造菜单、显示
(4) 菜单响应(action)
其次要注意:
QPoint pt_global = ui.listWidget->mapToGlobal(pt) ;
menu.exec(pt_global);
要把这个QPoint转换到全局坐标(屏幕坐标)
下面是整个源码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QTreeWidgetItem* AddItem(const QString &filename
,const QString &last_modified
,const QString &type
,int size
,QIcon icon
,QTreeWidgetItem *parent=NULL);
private slots:
int OnWidgetContextMeun(const QPoint& pt); //右键弹出菜单
int OnMenuAdd();
int OnMenuRemove();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->treeWidget->setColumnCount(4);
//设置宽度
ui->treeWidget->setColumnWidth(0,150);
QStringList headers;
headers.append("Filename");
headers.append("Last Modified");
headers.append("Type");
headers.append("Size");
ui->treeWidget->setHeaderLabels(headers);
QIcon icon_folder(":/folder.png");
QIcon icon_file(":/file.png");
this->AddItem("Qt5开发实例.txt","2016-01-15","text file",8512,icon_file);
this->AddItem("MFC开发实例.txt","2010-04-27","text file",4526,icon_file);
this->AddItem("Java开发实例.txt","2011-12-7","text file",1526,icon_file);
this->AddItem("C#开发实例.txt","2009-08-5","text file",7895,icon_file);
QTreeWidgetItem* item=AddItem("video","2018-03-25","folder",0,icon_folder);
AddItem("Qt管理系统开发视频.mp4","2018-03-25","mp4 file",4512,icon_file,item);
//右键弹出菜单-右键菜单支持
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(OnWidgetContextMeun(QPoint)));
connect(ui->actionAdd,SIGNAL(triggered(bool)),this,SLOT(OnMenuAdd()));
connect(ui->actionRemove,SIGNAL(triggered(bool)),this,SLOT(OnMenuRemove()));
}
int Widget::OnWidgetContextMeun(const QPoint &pt){
//当前选中项
QTreeWidgetItem *selected=ui->treeWidget->itemAt(pt);
//qDebug()<actionAdd);
if(selected){
menu.addAction(ui->actionRemove);
}
//显示菜单
menu.exec(ui->treeWidget->mapToGlobal(pt));
return 0;
}
int Widget::OnMenuAdd(){
QString msg=ui->treeWidget->currentItem()->text(0); //获取当前行的数据
//qDebug()<treeWidget->currentItem()->text(0); //获取当前行的数据
//qDebug()<setText(0,filename);
item->setIcon(0,icon);
item->setText(1,last_modified);
item->setText(2,type);
item->setText(3,QString::number(size));
if(parent)
parent->addChild(item);
else
ui->treeWidget->addTopLevelItem(item);
return item;
}
Widget::~Widget()
{
delete ui;
}
main.cpp
#include "widget.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
完整项目代码下载地址:
https://download.csdn.net/download/qq78442761/10307122