我想编写一个可以访问数据库中表的应用程序。我把QSqlTableModel作为表的模型组件。
QTableView的问题在于它似乎没有返回表中当前所选记录的方法,所以我采用了QTableWidget类来插入QTableView。
但是当我尝试使用 - > setModel()将模型设置为此表格小部件时,我得到了
以下错误消息:
C:/ QT / QT /包含/ QtGui /../../ SRC / GUI / itemviews / qtablewidget.h:337: 错误:`virtual void QTableWidget :: setModel(QAbstractItemModel *)'是 私有的。
消息说方法“setModel”是私有的。展望着 文档告诉我它是公开的。
我该怎么办?
答案 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类提供了一个带有默认模型的基于项目的表视图。
表小部件为应用程序提供标准表显示工具。 QTableWidget中的项目由QTableWidgetItem提供。
如果你想要一个使用你自己的数据模型的表,你应该使用QTableView而不是这个类。
widget类处理模型本身,如果要使用自己的模型,请使用View类。
您是正确的,似乎没有方法可以知道TableView或SQLModel的选择。您可以从TableView派生自己的类,并通过selectionChanged slot跟踪当前选择。
OR
使用QTableView::selectionModel()并致电selection()。这类似于mmutz的answer。请务必阅读该代码,了解实际进入记录的血腥细节。
答案 4 :(得分:0)
我只使用过一次模型 - 视图架构,但我会尝试给你一些关于该架构的一般见解,因为在我看来你还不太了解它。所以这可能是不完整和简化的,但希望有点正确。
如果您使用视图,则可以为您提供自己的模型。如果您使用小部件,那么您不使用qt模型,但自己插入项目。最好使用模型来解耦事物(因此您可以为同一模型设置多个视图,或稍后更改模型,...)
当您使用模型时,视图本身将知道如何询问您提供的模型以填充视图(使用数据函数)。有几种方法可以从这个视图中进行选择:我通过连接点击的信号来处理它,当用户在视图中点击时视图发出,我自己编写的插槽函数。单击的信号提供了我映射到该插槽函数中模型中的项目的表/列表的索引。
可能有更多的方法可以做到这一点,但这就是我如何做到这一点并且工作正常。
要全面掌握qt模型 - 视图架构: