Qt之视图QTableView

  Qt引入了模型/视图结构用于完成数据与界面的分离,即InterView框架。InterView框架把视图和控制器部件结合在一起,使得框架更为简洁。
 Qt的模型/视图结构分为三部分:模型(Model)、视图(View)和代理(Delegate)。模型与数据源通信,并为其他部件提供接口;视图从模型中获得用来引用数据条目的模型索引。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。模型/视图/代理之间通过信号和槽进行通信。
 本文主要展示模型数据加载、视图显示和代理操作三部分功能。示例显示:
 ![请添加图片描述](https://img-blog.csdnimg.cn/direct/4d68b5328011426fa15ad97773e435fa.gif)

1.模型数据加载

QStandardItemModel m_model;
    m_model.setRowCount(4);
    m_model.setColumnCount(4);
    m_model.setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("姓名"));
    m_model.setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("生日"));
    m_model.setHeaderData(2,Qt::Horizontal,QString::fromLocal8Bit("职业"));
    m_model.setHeaderData(3,Qt::Horizontal,QString::fromLocal8Bit("收入"));
     QFile file("../SRC/doc/test.txt");
    if(file.open(QFile::ReadOnly|QFile::Text))
    {
        QTextStream stream(&file);
        QString line;
        m_model.removeRows(0,m_model.rowCount(QModelIndex()),QModelIndex());
        int row = 0;
        do
        {
            line = stream.readLine();
            if(!line.isEmpty())
            {
                m_model.insertRows(row,1,QModelIndex());
                QStringList pieces = line.split(",",QString::SkipEmptyParts);
                m_model.setData(m_model.index(row,0,QModelIndex()),pieces.value(0));
                m_model.setData(m_model.index(row,1,QModelIndex()),pieces.value(1));
                m_model.setData(m_model.index(row,2,QModelIndex()),pieces.value(2));
                m_model.setData(m_model.index(row,3,QModelIndex()),pieces.value(3));
                row++;
            }
        }while(!line.isEmpty());
        file.close();
    }

2.视图显示

ui->tableView->setModel(&m_model);
QHeaderView* headerView = ui->tableView->horizontalHeader();
headerView->setSectionResizeMode(QHeaderView::Interactive);

3.代理操作

    DateDelegate m_dateDelegate;
    ComboDelegate m_comboDelegate;
    SpinDelegate m_spinDelegate;
    ui->tableView->setItemDelegateForColumn(1,&m_dateDelegate);
    ui->tableView->setItemDelegateForColumn(2,&m_comboDelegate);
    ui->tableView->setItemDelegateForColumn(3,&m_spinDelegate);

3.1时间日历代理

构建项目DataDelegate,使用手动的方式实现对生日的录入编辑。

class DateDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    DateDelegate(QObject *parent = nullptr);
    //完成创建控件的工作
    QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index)const;
    //设置控件显示的数据,将Model中的数据更新至Delegate中
    void setEditorData(QWidget *editor,const QModelIndex &index)const;
    void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index)const;
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index)const;
};
DateDelegate::DateDelegate(QObject *parent):QItemDelegate(parent)
{

}
QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //新建QDateTimeEdit对象
    QDateTimeEdit *editor = new QDateTimeEdit(parent);
    editor->setDisplayFormat("yyyy-MM-dd");
    editor->setCalendarPopup(true);//以Popup的方式显示日历
    editor->installEventFilter(const_cast<DateDelegate*>(this));//安装事件过滤器,使DateDelegate能够捕获QDateTimeEdit对象
    return editor;
}
void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString dateStr = index.model()->data(index).toString();//获取指定index数据项的数据
    QDate date = QDate::fromString(dateStr,Qt::ISODate);//转换QString类型表示的日期数据转换为QDate类型
    QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor);
    edit->setDate(date);
}
void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor);//获取编辑控件的对象指针
    QDate date = edit->date();//获取编辑控件中的数据更新
    model->setData(index,QVariant(date.toString(Qt::ISODate)));//调用setDate()函数将数据更新到Model中
}
void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

3.2下拉框代理

构建项目ComboDelegate,使用手动的方式实现对职业的录入编辑

class ComboDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    ComboDelegate(QObject *parent = nullptr);
    //完成创建控件的工作
    QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index)const;
    //设置控件显示的数据,将Model中的数据更新至Delegate中
    void setEditorData(QWidget *editor,const QModelIndex &index)const;
    void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index)const;
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index)const;
};
ComboDelegate::ComboDelegate(QObject *parent):QItemDelegate(parent)
{

}
QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //创建QComboBox控件
    QComboBox *editor = new QComboBox(parent);
    editor->addItem("工人");
    editor->addItem("农民");
    editor->addItem("医生");
    editor->addItem("律师");
    editor->addItem("军人");
    editor->installEventFilter(const_cast<ComboDelegate*>(this));
    return editor;
}
void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString str = index.model()->data(index).toString();
    QComboBox *box = static_cast<QComboBox*>(editor);
    int i = box->findText(str);
    box->setCurrentIndex(i);
}
void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *box = static_cast<QComboBox*>(editor);
    QString str = box->currentText();
    model->setData(index,str);
}

void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

3.3输入框代理

构建项目ComboDelegate,使用手动的方式实现对收入的录入编辑。

class SpinDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    SpinDelegate(QObject *parent = nullptr);
    //完成创建控件的工作
    QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index)const;
    //设置控件显示的数据,将Model中的数据更新至Delegate中
    void setEditorData(QWidget *editor,const QModelIndex &index)const;
    void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index)const;
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index)const;
};
SpinDelegate::SpinDelegate(QObject *parent):QItemDelegate(parent)
{

}
QWidget *SpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSpinBox *spinBox = new QSpinBox(parent);
    spinBox->setRange(0,10000);
    spinBox->installEventFilter(const_cast<SpinDelegate*>(this));
    return spinBox;
}
void SpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value = index.model()->data(index).toInt();
    QSpinBox *box = static_cast<QSpinBox*>(editor);
    box->setValue(value);
}
void SpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QSpinBox *box = static_cast<QSpinBox*>(editor);
    int value = box->value();
    model->setData(index,value);
}
void SpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt中的QComboBox是一个下拉列表框控件,可以用于选择单个项。它提供了一组方法和信号槽来管理下拉框中的项,可以方便地添加、删除和修改选项。 QTableView是一个表格视图控件,可以用于显示二维数据。它通过提供模型-视图的机制,将数据与表格视图分离,使得数据的管理和展示更加灵活。QTableView可以显示不同的模型,并提供了编辑、排序和过滤等功能。 在使用QComboBox和QTableView时,可以结合使用两者来实现一些复杂的功能。例如,可以将QComboBox用作QTableView的筛选条件选择器。利用QComboBox的信号槽机制,在选择不同的筛选条件时,响应的更新QTableView的内容,从而实现数据的动态过滤显示。 另外,还可以使用QComboBox来选择QTableView中的编辑项。用户可以通过下拉框选择要编辑的行或列,然后通过QTableView提供的函数来修改表格中的数据。这样,用户可以方便地对表格的特定内容进行编辑和管理。 总之,Qt的QComboBox和QTableView是两个非常有用的控件,可以分别用于选择和展示数据。通过巧妙地结合使用,可以实现一些复杂的功能,提高用户体验和开发效率。 ### 回答2: Qt是一款流行的跨平台的C++开发框架,提供了丰富的图形用户界面(GUI)工具。QComboBox是Qt中的一个组件,它是一个下拉列表框,允许用户选择一个或多个选项。QTableViewQt中的另一个组件,它是一个表格视图,用于显示二维数据。 QComboBox和QTableView可以很好地结合使用,以提供更丰富和交互性的用户界面。例如,可以将QComboBox用作QTableView的过滤器,允许用户选择不同的选项来过滤和显示特定的数据。 要在QComboBox中显示选项,可以使用addItem()方法添加选项,也可以使用setModel()方法设置数据模型。在QTableView中显示数据,通常需要使用QStandardItemModel或QAbstractTableModel作为数据模型,并使用setModel()方法将其设置给QTableView。 在QComboBox中选择选项后,可以通过信号和槽机制来响应选择的变化,并更新QTableView中显示的数据。例如,可以在QComboBox的currentIndexChanged()信号的槽函数中,根据选择的选项更新QTableView的数据模型,然后通过重新设置数据模型更新QTableView的显示。 除了基本功能外,还可以通过自定义QComboBox和QTableView的样式和控件来实现更丰富的用户界面。还可以使用QComboBox的其他方法,如currentIndex()获取当前选择的索引,currentText()获取当前选择的文本等。 总而言之,Qt的QComboBox和QTableView组件为开发者提供了一种方便和灵活的方式来处理下拉列表和表格数据,使用户界面更加友好和交互性。 ### 回答3: Qt是一种跨平台的C++应用程序开发框架,提供了丰富的UI控件和功能模块,其中包括QComboBox和QTableView。 QComboBox是用来显示和选择多个选项中的一个的下拉列表控件。它的特点是可以添加多个选项,用户可以通过下拉列表来选择不同的选项。QComboBox可以实现单选和多选功能,还可以通过信号和槽机制来响应用户的选择动作。 QTableView是用来显示二维表格数据的控件。它以表格的形式将数据呈现给用户,用户可以通过鼠标或键盘来对表格进行操作,例如选择单元格、编辑单元格内容、排序、过滤等。QTableView还支持数据模型和视图的分离,可以通过自定义的数据模型来呈现不同的数据类型。 在使用Qt中的QComboBox和QTableView时,可以通过不同的方法来设置和获取它们的属性,例如设置选项列表、设置显示文本、设置当前选项、设置表格数据、设置表头等。还可以通过信号和槽机制来处理用户的交互操作,例如响应选项选择事件、响应表格数据变化事件等。 QComboBox和QTableView都可以通过样式表来进行界面的美化,并且可以通过自定义子类来扩展其功能。同时,Qt提供了丰富的文档和示例代码,方便开发者学习和使用这些控件。 总之,Qt中的QComboBox和QTableView是常用的UI控件,可以方便地实现下拉列表和表格数据的展示和交互操作。通过灵活的属性设置和信号槽机制,能够满足不同的使用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值