将模型设置为QTableWidget

时间:2009-07-16 13:48:12

标签: c++ sql qt

我想编写一个可以访问数据库中表的应用程序。我把QSqlTableModel作为表的模型组件。

QTableView的问题在于它似乎没有返回表中当前所选记录的方法,所以我采用了QTableWidget类来插入QTableView。

但是当我尝试使用 - > setModel()将模型设置为此表格小部件时,我得到了

以下错误消息:

  

C:/ QT / QT /包含/ QtGui /../../ SRC / GUI / itemviews / qtablewidget.h:337:   错误:`virtual void QTableWidget :: setModel(QAbstractItemModel *)'是   私有的。

消息说方法“setModel”是私有的。展望着 文档告诉我它是公开的。

我该怎么办?

5 个答案:

答案 0 :(得分:5)

正如其他人所说,你想要的不是QTableWidget。确实是QTableView。然后像这样完成记录:

static QList<QSqlRecord> selected_records( const QTableView * tv ) {
    // make sure we're really dealing with what we think we're dealing with:
    assert( static_cast<QSqlTableModel*>( tv->model() )
            == qobject_cast<QSqlTableModel*>( tv->model() );
    const QSqlTableModel * const tm = static_cast<QSqlTableModel*>( tv->model() );
    const QModelIndexList mil = tv->selectionModel()->selectedRows();
    QList<QSqlRecord> result;
    Q_FOREACH( const QModelIndex & mi, mil )
        if ( mi.isValid() )
            result.push_back( tm->record( mi.row() ) );
    return result;
}

如果,OTOH,您正在与clicked(QModelIndex)QTableView}的{ - 1}信号连接的插槽中工作(真的:QAbstractItemView),那么此代码就是您想要的:< / p>

void slotClicked( const QModelIndex & mi ) {
    // make sure we're really dealing with what we think we're dealing with:
    assert( static_cast<QSqlTableModel*>( tableView->model() )
            == qobject_cast<QSqlTableModel*>( tableView->model() );
    const QSqlRecord rec = static_cast<QSqlTableModel*>( tableView->model() )
               ->record( mi.row() );
    // use 'rec'
} 

是的,Qt可能有内置的,尤其是。 QSqlTableModel可以更方便地将QModelIndex映射回QSqlRecord,但是你去了。

答案 1 :(得分:2)

该方法在QAbstractItemView级别是公开的,但QTableWidget有一个您无法更改的内置模型。

要获得选择,您必须拨打selectedItems()(这又是QAbstractItemView而不是QTableView的方法,这就是您在文档中错过的原因)。

答案 2 :(得分:0)

它在QTableWidget中是私有的

class Q_GUI_EXPORT QTableWidget : public QTableView
{
...
...
private:
    void setModel(QAbstractItemModel *model);
...

它在QAbstractItemView

中是公开的

所以你不能从这里调用这个函数......

检查include \ Qt \ qtablewidget.h中的qtablewidget.h

也许这不是一个好的答案,但至少它说明了为什么它不起作用......

答案 3 :(得分:0)

QTableWidget:Details

  

QTableWidget类提供了一个带有默认模型的基于项目的表视图。

     

表小部件为应用程序提供标准表显示工具。 QTableWidget中的项目由QTableWidgetItem提供。

     

如果你想要一个使用你自己的数据模型的表,你应该使用QTableView而不是这个类。

widget类处理模型本身,如果要使用自己的模型,请使用View类。

您是正确的,似乎没有方法可以知道TableView或SQLModel的选择。您可以从TableView派生自己的类,并通过selectionChanged slot跟踪当前选择。

OR

使用QTableView::selectionModel()并致电selection()。这类似于mmutz的answer。请务必阅读该代码,了解实际进入记录的血腥细节。

答案 4 :(得分:0)

我只使用过一次模型 - 视图架构,但我会尝试给你一些关于该架构的一般见解,因为在我看来你还不太了解它。所以这可能是不完整和简化的,但希望有点正确。

如果您使用视图,则可以为您提供自己的模型。如果您使用小部件,那么您不使用qt模型,但自己插入项目。最好使用模型来解耦事物(因此您可以为同一模型设置多个视图,或稍后更改模型,...)

当您使用模型时,视图本身将知道如何询问您提供的模型以填充视图(使用数据函数)。有几种方法可以从这个视图中进行选择:我通过连接点击的信号来处理它,当用户在视图中点击时视图发出,我自己编写的插槽函数。单击的信号提供了我映射到该插槽函数中模型中的项目的表/列表的索引。

可能有更多的方法可以做到这一点,但这就是我如何做到这一点并且工作正常。

要全面掌握qt模型 - 视图架构:

http://doc.trolltech.com/4.5/model-view-programming.html