一起看代码来玩玩QT之18 database(four 向QtableView 添加代理view->setItemDelegate ,让代理作一些东西)

来源:互联网 发布:淘宝哪家美妆店是正品 编辑:程序博客网 时间:2024/05/24 07:28

Widget04.h

#ifndef WIDGET04_H#define WIDGET04_H#include <QObject>#include <QSqlTableModel>#include <QTableView> // show table#include <QItemDelegate>#include <QComboBox>class TUserDelegate : public QItemDelegate{    QWidget *createEditor(QWidget * parent,                          const QStyleOptionViewItem &option,                          const QModelIndex &index) const    {        if(index.column() == 0)            return NULL;        if(index.column() == 3)        {            QComboBox*  combo = new QComboBox(parent);            combo->addItem("男");            combo->addItem("女");            return combo;        }        return QItemDelegate::createEditor(parent, option, index);    }};#if 0   //////////// column 0;class ReadOnlyDelegate : public QItemDelegate{    QWidget *createEditor(QWidget *,                          const QStyleOptionViewItem &,                          const QModelIndex &) const    {        return NULL;    }};class GenderDelegate : public QItemDelegate{public:    QWidget *createEditor(QWidget *parent,                          const QStyleOptionViewItem &,                          const QModelIndex &) const    {        QComboBox*  combo = new QComboBox(parent);        combo->addItem("男");        combo->addItem("女");        return combo;    }};#endif//////////////////column 3 sexclass MyTableModel : public QSqlTableModel{public:    QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const    {     //   if(role == Qt::DisplayRole)     //       return QSqlTableModel::data(idx, role);        if(idx.column() != 3)            return QSqlTableModel::data(idx, role);        QVariant var = QSqlTableModel::data(idx, role);  //Qvariant 万能类型        if(var == 0)        {            return "女";        }        return "男";    }    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)    {        if(index.column() != 3)            return QSqlTableModel::setData(index, value, role);        if(value == "男")            return QSqlTableModel::setData(index, 1, role);        return QSqlTableModel::setData(index, 0, role);    }};class Widget04 : public QWidget{    Q_OBJECTpublic:    explicit Widget04(QWidget *parent = 0);    MyTableModel* _model;    QTableView* _view;signals:public slots:    void slotSubmitClicked();    void slotDelClicked();    void slotAddClicked();};#endif // WIDGET04_H

Widget04.cpp

#include "Widget04.h"#include <QVBoxLayout>#include <QHBoxLayout>#include <QPushButton>#include <QMessageBox>#include <QSqlError>#include <QSqlDatabase>#include <QSqlRecord>Widget04::Widget04(QWidget *parent) :    QWidget(parent){    _model = new MyTableModel;    _model->setTable("tuser");    _model->select();   _model->setEditStrategy(QSqlTableModel::OnManualSubmit);    _model->setHeaderData(0, Qt::Horizontal, "编号");    _model->setHeaderData(1, Qt::Horizontal, "用户名");    _model->setHeaderData(2, Qt::Horizontal, "密码");    _model->setHeaderData(3, Qt::Horizontal, "性别");    _view = new QTableView;    _view->setModel(_model);//    _view->hideColumn(2);  //  _view->setItemDelegateForColumn(3, new GenderDelegate);   // _view->setItemDelegateForColumn(0, new ReadOnlyDelegate);    _view->setItemDelegate(new TUserDelegate); //添加 代理    QVBoxLayout* lay = new QVBoxLayout(this);    lay->addWidget(_view);    QHBoxLayout* hBox = new QHBoxLayout;    lay->addLayout(hBox);    hBox->addStretch();    QPushButton* del = new QPushButton("del");    connect(del, SIGNAL(clicked()), this, SLOT(slotDelClicked()));    hBox->addWidget(del);    QPushButton* submit = new QPushButton("submit");    connect(submit, SIGNAL(clicked()), this, SLOT(slotSubmitClicked()));    hBox->addWidget(submit);    QPushButton* add = new QPushButton("add");    connect(add, SIGNAL(clicked()), this, SLOT(slotAddClicked()));    hBox->addWidget(add);}void Widget04::slotAddClicked(){    QSqlRecord record = _model->record();    _model->insertRecord(-1, record);}void Widget04::slotDelClicked(){    // 通过_view去获取被选中的部分的数据model    QItemSelectionModel * selectModel = _view->selectionModel();// 通过选中的数据结构,获取这些格子的ModelIndex    QModelIndexList selectList =  selectModel->selectedIndexes();    QList<int> delRow;    // 遍历这些格子,获取格子所在行,因为可能存在相同的行,所以要去重    for(int i=0; i<selectList.size(); ++i)    {        QModelIndex index = selectList.at(i);      //  _model->removeRow(index.row());        delRow << index.row();    }    while(delRow.size() > 0)    {        int row = delRow.at(0);        delRow.removeAll(row);        _model->removeRow(row);    }    _model->submitAll();}void Widget04::slotSubmitClicked(){    if(!_model->submitAll())    {        QMessageBox::critical(this, "Error", QSqlDatabase().lastError().text());    }}

main.cpp

#include <QApplication>#include "Widget04.h"#include <QSqlDatabase>#include <QSqlError>#include <QDebug>#include "Contact.h"int main(int argc, char*argv[]){    QApplication app(argc, argv);    /* QSQLITE QODBC QPLSQL */    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");    db.setHostName("127.0.0.1");    db.setUserName("root");    db.setPassword("iamxgl");    db.setDatabaseName("d0718");    bool bRet = db.open();    if(bRet == false)    {        qDebug() << "error open database" << db.lastError().text();        exit(0);    }    qDebug() << "open database success";    Widget04 w;    w.show();    return app.exec();}


1 0
原创粉丝点击