`
qimo601
  • 浏览: 3445984 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt表格中以旋转框的形式数据交互

    博客分类:
  • Qt
阅读更多

 

 Qt中自带的例子。详细情况,还得仔细看一下Model/View那一章。

 

The Spin Box Delegate example shows how to create an editor for a custom delegate in the model/view framework by reusing a standard Qt editor widget.

The model/view framework provides a standard delegate that is used by default with the standard view classes. For most purposes, the selection of editor widgets available through this delegate is sufficient for editing text, boolean values, and other simple data types. However, for specific data types, it is sometimes necessary to use a custom delegate to either display the data in a specific way, or allow the user to edit it with a custom control.

This concepts behind this example are covered in the Delegate Classes chapter of the Model/View Programming overview.

SpinBoxDelegate Class Definition

The definition of the delegate is as follows:

 class SpinBoxDelegate : public QItemDelegate

 {

     Q_OBJECT

 

 public:

     SpinBoxDelegate(QObject *parent = 0);

 

     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,

                           const QModelIndex &index) const;

 

     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;

 };

The delegate class declares only those functions that are needed to create an editor widget, display it at the correct location in a view, and communicate with a model. Custom delegates can also provide their own painting code by reimplementing the paintEvent() function.

SpinBoxDelegate Class Implementation

Since the delegate is stateless, the constructor only needs to call the base class's constructor with the parent QObject as its argument:

 SpinBoxDelegate::SpinBoxDelegate(QObject *parent)

     : QItemDelegate(parent)

 {

 }

Since the delegate is a subclass of QItemDelegate, the data it retrieves from the model is displayed in a default style, and we do not need to provide a custom paintEvent().

The createEditor() function returns an editor widget, in this case a spin box that restricts values from the model to integers from 0 to 100 inclusive.

 QWidget *SpinBoxDelegate::createEditor(QWidget *parent,

     const QStyleOptionViewItem &/* option */,

     const QModelIndex &/* index */) const

 {

     QSpinBox *editor = new QSpinBox(parent);

     editor->setMinimum(0);

     editor->setMaximum(100);

 

     return editor;

 }

We install an event filter on the spin box to ensure that it behaves in a way that is consistent with other delegates. The implementation for the event filter is provided by the base class.

The setEditorData() function reads data from the model, converts it to an integer value, and writes it to the editor widget.

 void SpinBoxDelegate::setEditorData(QWidget *editor,

                                     const QModelIndex &index) const

 {

     int value = index.model()->data(index, Qt::EditRole).toInt();

 

     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);

     spinBox->setValue(value);

 }

Since the view treats delegates as ordinary QWidget instances, we have to use a static cast before we can set the value in the spin box.

The setModelData() function reads the contents of the spin box, and writes it to the model.

 void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,

                                    const QModelIndex &index) const

 {

     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);

     spinBox->interpretText();

     int value = spinBox->value();

 

     model->setData(index, value, Qt::EditRole);

 }

We call interpretText() to make sure that we obtain the most up-to-date value in the spin box.

The updateEditorGeometry() function updates the editor widget's geometry using the information supplied in the style option. This is the minimum that the delegate must do in this case.

 void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,

     const QStyleOptionViewItem &option, const QModelIndex &/* index */) const

 {

     editor->setGeometry(option.rect);

 }

More complex editor widgets may divide the rectangle available in option.rect between different child widgets if required.

The Main Function

This example is written in a slightly different way to many of the other examples supplied with Qt. To demonstrate the use of a custom editor widget in a standard view, it is necessary to set up a model containing some arbitrary data and a view to display it.

We set up the application in the normal way, construct a standard item model to hold some data, set up a table view to use the data in the model, and construct a custom delegate to use for editing:

 int main(int argc, char *argv[])

 {

     QApplication app(argc, argv);

 

     QStandardItemModel model(4, 2);

     QTableView tableView;

     tableView.setModel(&model);

 

     SpinBoxDelegate delegate;

     tableView.setItemDelegate(&delegate);

The table view is informed about the delegate, and will use it to display each of the items. Since the delegate is a subclass of QItemDelegate, each cell in the table will be rendered using standard painting operations.

We insert some arbitrary data into the model for demonstration purposes:

     for (int row = 0; row < 4; ++row) {

         for (int column = 0; column < 2; ++column) {

             QModelIndex index = model.index(row, column, QModelIndex());

             model.setData(index, QVariant((row+1) * (column+1)));

         }

     }

Finally, the table view is displayed with a window title, and we start the application's event loop:

     tableView.setWindowTitle(QObject::tr("Spin Box Delegate"));

     tableView.show();

     return app.exec();

 }

Each of the cells in the table can now be edited in the usual way, but the spin box ensures that the data returned to the model is always constrained by the values allowed by the spin box delegate.

分享到:
评论

相关推荐

    基于QT实现的上下拉刷新的功能

    在本项目中,"基于QT实现的上下拉刷新的功能"是利用QT的QML模块来设计和实现的。 QML,全称Qt Meta Language,是QT框架的一部分,它是一种声明式语言,用于描述UI界面和交互逻辑。QML通过简洁的JSON-like语法定义了...

    表格及绘图2中形式表示输入输出关系图.rar

    本项目以"表格及绘图2中形式表示输入输出关系图.rar"为主题,利用Qt框架中的关键组件,如QGraphicsView、QGraphicsScene和QGraphicsItem,来创建一个直观的图形界面,用于展示算法的输入输出参数之间的关联。...

    QT知识总结

    3. **QTableView**: QTableView是QT中处理表格数据的控件。它允许显示二维表格数据,并且可以与不同的数据模型(如QStandardItemModel或QSqlTableModel)配合使用。QTableView提供了列的调整、排序、过滤等功能,...

    qt 的简单的打印预览

    4. **界面交互**:为了使用户能够控制预览,如缩放、旋转等,可以添加`QPrintPreviewWidget`的布局控件。同时,提供一个按钮来触发打印操作: ```cpp QPushButton *printButton = new QPushButton("打印", parent);...

    QTbangzhu.zip_Qt 中文帮助

    在Qt中,有各种各样的组件和控件供开发者使用,如按钮(QPushButton)、标签(QLabel)、文本框(QLineEdit)、对话框(QDialog)、表格视图(QTableView)等。这些组件覆盖了大部分常见的UI元素,且可以通过样式表...

    QT图形与视图框架(最基础篇)

    QT图形与视图框架是Qt库中的一个核心组件,它为开发者提供了强大的2D和3D图形渲染能力,以及高效的数据可视化解决方案。这个框架的设计理念是将数据模型、视图和代理模型分离,使得在复杂应用程序中管理和显示大量...

    Qt高级编程(中文版+英文版)两本

    3. **模型视图架构(Model/View Architecture)**:Qt的模型视图架构提供了一种灵活的方式来展示和操作数据,可以用于表格、列表、树形结构等多种数据展示。 4. **图形视图框架(Graphics View Framework)**:用于...

    qt的一些控件

    QT的容器控件如`QListWidget`、`QTableWidget`和`QTreeWidget`用于展示列表、表格和树状结构的数据。它们可以与数据模型(如`QListModel`、`QStandardItemModel`)配合,实现数据的动态更新和操作。 此外,QT还有...

    Qt实例编程

    QAbstractItemModel定义了模型接口,允许数据以表格或列表形式展示。QTableView、QListView和QTreeView是常见的视图组件,它们可以根据模型数据动态更新。通过这种方式,数据模型可以独立于用户界面变化,增强了程序...

    qt参考手册

    7. **数据库集成**:通过QSqlDatabase、QSqlQuery等类,Qt可以直接与多种数据库系统交互,如SQLite、MySQL和PostgreSQL。 8. **国际化和本地化**:Qt支持多语言环境,QTranslator和QLocale类使得应用能够轻松适应...

    QT一个月自学教程

    - **11.1 顺序容器**:这部分介绍了Qt中的顺序容器类,如QList、QVector等,这些容器类适用于存储有序的数据集。 - **11.2 关联容器**:这里讨论了Qt中的关联容器类,如QMap、QHash等,这些容器类适用于基于键值对...

    狄泰软件学院Qt开发课程第2课GUI程序实例分析

    我们可以使用QGraphicsView和QGraphicsScene来创建复杂的2D图形场景,并添加动画效果,如平移、旋转和缩放,以增强用户体验。 在课程中,我们还会接触到资源管理,包括图标(QIcon)、字体(QFont)和本地化...

    QT whitepaper Web

    为了更好地与数据库交互,Qt提供了一系列数据感知部件,如表格视图、列表视图等。这些部件可以自动更新数据显示,使得应用程序能够实时反映数据库的变化。 #### 八、国际化 ##### 8.1 Unicode 为了支持国际化,Qt...

    QT5开发与实例代码 第6-7章代码 书里面自带的demo 感谢原作者

    3. **模型视图编程**:QT5的模型视图架构支持数据的分层表示和显示,常用于表格和列表。模型存储数据,视图负责展示,而代理在两者之间协调。 4. **图形视图框架**:用于处理复杂的2D图形和动画。QGraphicsView和...

    Qt 例子合集

    例如,QTableView和QAbstractItemModel一起用于展示和操作表格数据。 4. **图形视图框架**:Qt Graphics View Framework提供了一个强大的2D绘图和动画系统,用于创建复杂的用户界面和图像处理应用。 5. **网络编程...

    Qt常用控件详细讲解

    在本文中,我们将深入探讨Qt库中的常用控件,这些控件是开发高效、美观的图形用户界面(GUI)的基础。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。它提供了丰富的控件集,使得开发者能够...

    qt.rar_QT4.5_Qt 4.5_Qt4 designer

    在QT4.5中,Qt Designer提供了丰富的控件库,如按钮、文本框、表格视图等,开发者可以自由布局和配置,极大地简化了UI设计过程。此外,Qt Designer支持生成.ui文件,这是一种XML格式的文件,记录了界面元素的布局和...

    Qt常用的控件widgets-例程

    在Qt库中,Widgets是构建用户界面(UI)的核心组件,它们提供了丰富的功能和灵活性,使得开发者能够创建出美观且功能强大的应用程序。本例程主要关注Qt中的常用控件,通过实际代码示例来帮助理解如何使用这些控件。...

    til.rar_currentRowChanged_qt tile_til_tilemap qt_地图编辑器

    “currentRowChanged”是一个事件,通常在Qt的表格或列表视图中触发,当用户在模型(如数据表格)的当前行发生变化时,这个事件会被激活。这在地图编辑器中可能用于追踪用户在地图层或瓦片集中的当前选择,允许实时...

Global site tag (gtag.js) - Google Analytics