【2】QT model-view架构

作者: 业余玩家 | 来源:发表于2017-01-09 20:02 被阅读128次

    本次学习的内容主要参考了豆子博主的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类型。这个类保存了三个重要的数据:行索引、列索引以及该数据属于哪一个模型。

    相关文章

      网友评论

        本文标题:【2】QT model-view架构

        本文链接:https://www.haomeiwen.com/subject/duphbttx.html