我想编写一个可以访问数据库中的表的应用程序。我将 QSqlTableModel 作为表格的模型组件。
QTableView 的问题在于它似乎没有返回表中当前选定记录的方法,所以我采用了与 QTableView 交互的 QTableWidget 类。
但是当我尝试使用 ->setModel() 将模型设置为这个表格小部件时,我得到了
以下错误信息:
c:/Qt/qt/include/QtGui/../../src/gui/itemviews/qtablewidget.h:337: error: `virtual void QTableWidget::setModel(QAbstractItemModel*)' is private.
消息说“setModel”方法是私有(private)的。展望 文档告诉我它是公开的。
我能做什么?
最佳答案
正如其他人所指出的,您想要的不是 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,您正在连接到 QTableView
的 - 比如说 - clicked(QModelIndex)
信号的插槽中工作(实际上:QAbstractItemView
), 那么这段代码就是你想要的:
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
,但就这样吧。
关于c++ - 将模型设置为 QTableWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137732/