【2】QT model-view架构

本次学习的内容主要参考了豆子博主的qt教程以及网上其他的一些文章的介绍,本次学习内容有点少,主要是在写代码时遇到了一些问题,思考和修改代码花费的时间较多。我想其根本原因还是以前学习的一些知识没有理解清楚,忘记的东西也不少,导致遇到问题的时候不能快速的解决。

QListWidget使用
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 

class MainWindow;

class MainWindow : public QMainWindow
{
 Q_OBJECT

public:
 explicit MainWindow(QWidget *parent = 0);
 ~MainWindow();

};

#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
 QMainWindow(parent)
{

 QLabel *label=new QLabel(this);
 label->setFixedWidth(70);

 QListWidget *listWidget=new QListWidget(this);

 new QListWidgetItem(QIcon(":/Chrome.png"),tr("Chrome"),listWidget);
 new QListWidgetItem(QIcon(":/Firefox.png"),tr("Firefox"),listWidget);

 listWidget->addItem(new QListWidgetItem(QIcon(":/IE.png"),tr("IE")));
 listWidget->setViewMode(QListView::IconMode);

 QListWidgetItem *newItem=new QListWidgetItem;
 newItem->setIcon(QIcon(":/Maxthon.png"));
 newItem->setText(tr("Maxthon"));
 listWidget->insertItem(3,newItem);

 QHBoxLayout *layout=new QHBoxLayout;
 layout->addWidget(label);
 layout->addWidget(listWidget);

 setLayout(layout);

 connect(listWidget,SIGNAL(currentTextChanged(QString)),label,SLOT(setText(QString)));

}

MainWindow::~MainWindow()
{
}
//main.cpp
#include "mainwindow.h"
#include 

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 MainWindow w;
 w.show();

 return a.exec();
}

备注:这个代码其实可以不用这样写,可以不需要mainwindow.cpp,将里面的代码写在main.cpp中就可以。

QTreeWidget的使用
//main.cpp
#include 
#include 
#include 

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);

 QTreeWidget treeWidget;
 //treeWidget.setColumnCount(1);

 QStringList headers;
 headers<<"name"<<"number";
 treeWidget.setHeaderLabels(headers);

 QStringList rootTextList;
 rootTextList<<"root"<<"0";
 QTreeWidgetItem *root=new QTreeWidgetItem(&treeWidget,rootTextList);

 new QTreeWidgetItem(root,QStringList()<setCheckState(0,Qt::Checked);

 QListrootList;
 rootList<

备注:这段代码用来实现树形目录结构,QTreeWidgetItem第一个参数用于指定这个项属于哪一个树,类似前面的QListWidgetItem,如果指定了这个值,则意味着该项被直接添加到树中;第二个参数指定显示的文字;第三个参数指定其类型,同QListWidgetItem的type参数十分类似。

QTableWidget的使用
#include 
#include 

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);

 QTableWidget tableWidget;
 //构建一个3X5表格
 tableWidget.setColumnCount(3);
 tableWidget.setRowCount(5);

 //表头数据描述
 QStringList headers;
 headers<<"ID"<<"Name"<<"Age"<<"Sex";
 tableWidget.setHorizontalHeaderLabels(headers);

 //插入数据
 tableWidget.setItem(0,0,new QTableWidgetItem(QString("0001")));

 //显示表格
 tableWidget.show();
 return a.exec();
}

备注:通过调用setItem()函数来设置表格的单元格的数据。这个函数前两个参数分别是行索引和列索引,这两个值都是从 0 开始的,第三个参数则是一个QTableWidgetItem对象。

QStringListModel的使用
//mylistview.h
#ifndef MYLISTVIEW_H
#define MYLISTVIEW_H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class MylistView:public QDialog
{
 Q_OBJECT
public:
 MylistView();

private slots:
 void insertData();
 void deleteData();
 void showData();
private:
 QStringListModel *model;
 QListView *listView;

};

#endif // MYLISTVIEW_H
//mylistview.cpp
#include "mylistview.h"

MylistView::MylistView()
{
 QStringList data;
 data<<"letter A"<<"letter B"<<"letter c";
 model=new QStringListModel();
 model->setStringList(data);

 listView=new QListView();
 listView->setModel(model);

 QPushButton *insertBtn=new QPushButton(tr("insert"));
 connect(insertBtn,SIGNAL(clicked()),this,SLOT(insertData()));
 QPushButton *delBtn=new QPushButton(tr("Delete"));
 connect(delBtn,SIGNAL(clicked()),this,SLOT(deleteData()));
 QPushButton *showBtn=new QPushButton(tr("Show"),this);
 connect(showBtn,SIGNAL(clicked()),this,SLOT(showData()));

 //水平布局
 QHBoxLayout *btnLayout=new QHBoxLayout;
 btnLayout->addWidget(insertBtn);
 btnLayout->addWidget(delBtn);
 btnLayout->addWidget(showBtn);

 //垂直布局
 QVBoxLayout *mainLayout=new QVBoxLayout;
 mainLayout->addWidget(listView);
 mainLayout->addLayout(btnLayout);

 setLayout(mainLayout);
}

//添加数据
void MylistView::insertData()
{
 bool isok;
 //要求用户输入数据
 QString text=QInputDialog::getText(this,"Insert","Please input new data:",QLineEdit::Normal,"You are inserting new data.",&isok);

 if(isok){
 QModelIndex currIndex=listView->currentIndex();
 model->insertRows(currIndex.row(),1);
 model->setData(currIndex,text);
 listView->edit(currIndex);
 }
}

//删除数据
void MylistView::deleteData()
{
 if(model->rowCount()>1){
 model->removeRows(listView->currentIndex().row(),1);
 }
}

//显示数据
void MylistView::showData()
{
 QStringList data=model->stringList();
 QString str;
 foreach(QString s,data){
 str+=s+"\n";
 }
 QMessageBox::information(this,"Data",str);

}
//main.cpp
#include "mylistview.h"
#include 

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);

 MylistView w;
 w.show();

 return a.exec();
}

备注:这段的实现花费了较长的时间,原因是对Qt信号槽的相关知识有所遗忘,于是又重新看了一遍相关文章。
类里面的Q_OBJECT不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
currentIndex()这个函数的返回值是一个QModelIndex类型。这个类保存了三个重要的数据:行索引、列索引以及该数据属于哪一个模型。

你可能感兴趣的:(【2】QT model-view架构)