Qt - QTable、QTab、QTree

转载自:http://mobile.51cto.com/symbian-268700.htm

简介

刷新QTableWidget程序异常崩溃(待证实)

QTableView用法小结

QTreeView开发实例

 

刷新QTableWidget程序异常崩溃

解决办法:clear()之后随即调用setRowCount(0)

 

QTableView用法小结

1、添加表头

//准备数据模型
QStandardItemModel *student_model = new QStandardItemModel();
student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));
student_model->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("NO.")));
student_model->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("Sex")));
student_model->setHorizontalHeaderItem(3, new QStandardItem(QObject::tr("Age")));
student_model->setHorizontalHeaderItem(4, new QStandardItem(QObject::tr("College")));

//利用setModel()方法将数据模型与QTableView绑定
ui->student_tableview->setModel(student_model);

2、设置表格属性

//设置列宽不可变动,即不能通过鼠标拖动增加列宽        
ui->student_tableview->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);   
ui->student_tableview->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);   
ui->student_tableview->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);   
ui->student_tableview->horizontalHeader()->setResizeMode(3, QHeaderView::Fixed);   
ui->student_tableview->horizontalHeader()->setResizeMode(4, QHeaderView::Fixed);   

//设置表格的各列的宽度值        
ui->student_tableview->setColumnWidth(0,100);    
ui->student_tableview->setColumnWidth(1,100);    
ui->student_tableview->setColumnWidth(2,100);    
ui->student_tableview->setColumnWidth(3,100);    
ui->student_tableview->setColumnWidth(4,100);    
    
//默认显示行头,如果你觉得不美观的话,我们可以将隐藏        
ui->student_tableview->verticalHeader()->hide();    
   
//设置选中时为整行选中        
ui->student_tableview->setSelectionBehavior(QAbstractItemView::SelectRows);         

//设置表格的单元为只读属性,即不能编辑        
ui->student_tableview->setEditTriggers(QAbstractItemView::NoEditTriggers); 
         
//如果你用在QTableView中使用右键菜单,需启用该属性        
ui->tstudent_tableview->setContextMenuPolicy(Qt::CustomContextMenu);

3、动态添加行 

在表格中添加行时,我们只需要在model中插入数据即可,一旦model中的数据发生变化,QTabelView显示就会做相应的变动

//在第一行添加学生张三的个人信息(setItem函数的第一个参数表示行号,第二个表示列号,第三个为要显示的数据)
student_model->setItem(0, 0, new QStandardItem(“张三"));
student_model->setItem(0, 1, new QStandardItem("20120202"));
student_model->setItem(0, 2, new QStandardItem(""));
student_model->setItem(0, 3, new QStandardItem("18"));
student_model->setItem(0, 4, new QStandardItem("土木学院"));

4、设置数据显示的样式

//设置单元格文本居中,张三的数据设置为居中显示
student_model->item(0, 0)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 1)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 2)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 3)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 4)->setTextAlignment(Qt::AlignCenter);

//设置单元格文本颜色,张三的数据设置为红色
student_model->item(0, 0)->setForeground(QBrush(QColor(255, 0, 0))); 
student_model->item(0, 1)->setForeground(QBrush(QColor(255, 0, 0))); 
student_model->item(0, 2)->setForeground(QBrush(QColor(255, 0, 0))); 
student_model->item(0, 3)->setForeground(QBrush(QColor(255, 0, 0))); 
student_model->item(0, 4)->setForeground(QBrush(QColor(255, 0, 0))); 

//将字体加粗
student_model->item(0, 0)->setFont(QFont("Times", 10, QFont::Black));
student_model->item(0, 1)->setFont(QFont("Times", 10, QFont::Black));
student_model->item(0, 2)->setFont(QFont("Times", 10, QFont::Black));
student_model->item(0, 3)->setFont(QFont("Times", 10, QFont::Black));
student_model->item(0, 4)->setFont(QFont("Times", 10, QFont::Black));

//设置排序方式,按年龄降序显示
student_model->sort(3, Qt::DescendingOrder);

 

QTreeView开发实例

1、使用QDirModel进行目录的现实,QDirModel是QT中专为文件目录树型显示所提供的一种model。 具体使用如下:

#include <QApplication>   
#include <QTextCodec>   
#include <QSplitter>   
#include <QDirModel>   
#include <QTreeView>  

int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));  
  
    QSplitter *splitter = new QSplitter;  
    QDirModel *model = new QDirModel;  
  
    // 从缺省目录创建数据   
    /* 配置一个view去显示model中的数据,只需要简单地调用setModel(),并把目录model作为参数传递 
       setRootIndex()告诉views显示哪个目录的信息,这需要提供一个model index,然后用这个index去model中获取数据 
       index()这个函数是QDirModel特有的,通过把一个目录作为参数,得到了需要的model index 
       其他的代码只是窗口show出来,然后进入程序的事件循环*/  
    QTreeView *tree = new QTreeView(splitter);  
    tree->setModel(model);  
    tree->setRootIndex(model->index("C:\\"));  
  
    splitter->setWindowTitle("目录");  
    splitter->setGeometry(100,100,450,200);  
    splitter->show();  
  
    return a.exec();  
}

显示结果如下所示:

 

2、自行设置树型结构。

treeview.h

#ifndef TREEVIEW_H   
#define TREEVIEW_H   
  
#include <QTreeView>   
#include <QList>   
#include <QStandardItem>   
#include <QMouseEvent>   

class TreeView : public QTreeView  
{  
    Q_OBJECT  
public:  
    explicit TreeView(QWidget *parent = 0);  
    void iteratorOverItems();  
    QList<QStandardItem *> returnTheItems();  
    void mouseDoubleClickEvent(QMouseEvent *event);  
      
signals:  
public slots:  
private:  
    QStandardItemModel *model;  
};  
#endif // TREEVIEW_H
treeview.cpp

#include "treeview.h"   
#include <QModelIndex>   
#include <QDebug>   
  
TreeView::TreeView(QWidget *parent) : QTreeView(parent)  
{  
    model = new QStandardItemModel(4, 2);  
    model->setHeaderData(0, Qt::Horizontal, "Service");  
    model->setHeaderData(1, Qt::Horizontal, "Details");  
  
    QStandardItem *item1 = new QStandardItem("avahi-daemon");  
    item1->setIcon(QIcon(":/btn_bright_01"));  
    QStandardItem *item2 = new QStandardItem("bluetooth");  
    item2->setIcon(QIcon(":/btn_bright_02"));  
    QStandardItem *item3 = new QStandardItem("crond");  
    item3->setIcon(QIcon(":/btn_bright_03"));  
    QStandardItem *item4 = new QStandardItem("cups");  
    item4->setIcon(QIcon(":/btn_bright_04"));  
  
    model->setItem(0, 0, item1);  
    model->setItem(1, 0, item2);  
    model->setItem(2, 0, item3);  
    model->setItem(3, 0, item4);  
  
    QStandardItem *item5 = new QStandardItem("fifth");  
    item4->appendRow(item5);  
  
    QModelIndex myparent;  
    for (int i=0; i<4; i++)  
    {  
        myparent = model->index(0, 0, myparent);  
        model->insertRows(0, 1, myparent);  // 添加一行   
        model->insertColumns(0, 1, myparent);   // 添加一列   
        QModelIndex index = model->index(0, 0, myparent);  
        model->setData(index, i);  
    }  
  
    this->setModel(model);  
}  
  
// 输出所有单元格的内容   
void TreeView::iteratorOverItems()  
{  
    QList<QStandardItem *> list = this->returnTheItems();  
    foreach (QStandardItem *item, list)  
    {  
        qDebug()<<item->text();  
    }  
}  
  
// 获取所有单元格   
QList<QStandardItem *> TreeView::returnTheItems()  
{  
    return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);  
}  
  
// 鼠标双击事件(输出被双击item的文本)   
void TreeView::mouseDoubleClickEvent(QMouseEvent *event)  
{  
    if (event->button() == Qt::LeftButton)  
    {  
        QModelIndex index = currentIndex();  
        qDebug()<<index.data().toString();  
    }  
}
main.cpp

#include <QApplication>   
#include "treeview.h"   
#include <QAbstractItemView>   
#include <QHeaderView>   
#include <QTextCodec>   
  
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));  
  
    TreeView view;  
    view.setEditTriggers(QAbstractItemView::NoEditTriggers);  
    view.header()->setResizeMode(QHeaderView::ResizeToContents);  
    view.resize(300,280);  
    view.iteratorOverItems();  
    view.setWindowTitle("Linux 服务管理");  
    view.show();  
  
    return a.exec();  
}  

显示效果:

 

posted @ 2022-03-16 14:25  Citrusliu  阅读(515)  评论(0编辑  收藏  举报