C++|Qt中QTreeWidget基本操作及完整代码下载

因为下个星期要中要做一个关于QTreeWidget相关的东西,特先学习相关点东西,明天就直接开始做了。


涉及如下技术:

1、在QTreeWidget中添加头(列头)。

2、往QTreeWidget中添加数据。

3、右键响应菜单栏。

4、关联信号与槽。


文件目录如下:

C++|Qt中QTreeWidget基本操作及完整代码下载_第1张图片


运行截图如下:



首先提供伪代码,再提供完整代码,最后提供整个项目的下载:


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

你可能感兴趣的:(C/C++,Qt)