【2】QT model-view架构

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

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

#include <QMainWindow>
#include <QLabel>
#include <QListWidget>
#include <QHBoxLayout>

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 <QApplication>

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 <QApplication>
#include <QTreeWidget>
#include <QList>

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()<<QString("Leaf 1")<<"1");
 QTreeWidgetItem *leaf2=new QTreeWidgetItem(root,QStringList()<<QString("leaf 2")<<"2");
 leaf2->setCheckState(0,Qt::Checked);

 QList<QTreeWidgetItem *>rootList;
 rootList<<root;
 treeWidget.insertTopLevelItems(0,rootList);

 treeWidget.show();

 return a.exec();
}

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

QTableWidget的使用
#include <QApplication>
#include <QTableWidget>

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 <QStringList>
#include <QStringListModel>
#include <QListView>
#include <QHBoxLayout>
#include <QPushButton>
#include <QVBoxLayout>
#include <QString>
#include <QLayout>
#include <QDialog>
#include <QInputDialog>
#include <QMessageBox>

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 <QApplication>

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类型。这个类保存了三个重要的数据:行索引、列索引以及该数据属于哪一个模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容