I am having trouble getting the 'new/next' row in a QTableWidget to have focus. I have a QTableWidget to hold authors names which will allow the user to add new author names to the 'list' of authors of a book. I am using a subclassed QItemDelegate and QTableWidgetItem similar to those in the spreadsheet example from Qt.
The delegate editor is a QLineEdit with a QSqlQueryModel, QTableView, and QCompleter. My approach is to always have an 'empty' row in the QTableWidget to allow the addition of authors. When the user enters a new author and hits return, a new row is added. I would like this new row to receive focus. When I set this to happen, the new row is not editable until I click on it, or tab out and back it. I am uncertain what I am missing. (ellipses represents other code) @ #ifndef AUTHORDELEGATE_H__ #include "bookswindow.h++" #include <QItemDelegate> #include <QDebug> class AuthorDelegate : public QItemDelegate { Q_OBJECT public: AuthorDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; private slots: void commitAndCloseEditor() ; }; #include <QtWidgets> AuthorDelegate::AuthorDelegate(QObject *parent) : QItemDelegate(parent) { qDebug() << "AuthorDelegate::AuthorDelegate" ; qDebug() << "AuthorDelegate::AuthorDelegate this: " << this ; qDebug() << "AuthorDelegate::AuthorDelegate parent: " << parent ; } QWidget * AuthorDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index ) const { QLineEdit *editor = new QLineEdit( parent ) ; editor->setMaximumWidth( 255) ; QSqlQueryModel * editorModel = new QSqlQueryModel( editor ) ; editorModel->setQuery( "SELECT authno , fullname FROM authorsView WHERE authNo > -1 ORDER BY fullname" ) ; QCompleter * editorCompleter = new QCompleter( editorModel ) ; editorCompleter->setModel( editorModel ) ; editorCompleter->setCompletionColumn( 1 ) ; editorCompleter->setMaxVisibleItems( 7 ) ; editorCompleter->setModelSorting( QCompleter::CaseInsensitivelySortedModel ) ; editorCompleter->setCompletionMode( QCompleter::UnfilteredPopupCompletion ) ; editorCompleter->setCaseSensitivity( Qt::CaseInsensitive ) ; QTableView * editorView = new QTableView ; editorCompleter->setPopup( editorView ) ; int width = editorView->columnWidth( 0 ) ; width += editorView->columnWidth( 1 ) ; editorView->setColumnHidden( 0 , true ) ; editorView->hideColumn( 0 ) ; editorView->setColumnWidth( 1 , 4 * width ) ; editorView->setMinimumWidth( width ) ; editorView->verticalHeader()->hide() ; editorView->horizontalHeader()->hide() ; editorView->verticalHeader()->setStretchLastSection( true ) ; editorView->verticalHeader()->setSectionResizeMode( 1 , QHeaderView::ResizeToContents ) ; editor->setCompleter( editorCompleter ) ; editorView->adjustSize() ; connect( editor , SIGNAL( editingFinished() ) , this , SLOT( commitAndCloseEditor() ) ) ; return editor ; } void AuthorDelegate::commitAndCloseEditor() { QLineEdit *editor = qobject_cast<QLineEdit *>( sender() ) ; emit commitData( editor ) ; emit closeEditor( editor ) ; } void AuthorDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const { qDebug() << "AuthorDelegate::setEditor" ; QLineEdit *edit = qobject_cast<QLineEdit*>( editor ) ; if ( edit ) { edit->setText( index.model()->data( index, Qt::EditRole ).toString() ) ; return ; } } void AuthorDelegate::setModelData( QWidget *editor , QAbstractItemModel *model , const QModelIndex &index ) const { qDebug() << "AuthorDelegate::setModelData" ; QLineEdit *edit = qobject_cast<QLineEdit *>( editor ) ; if ( edit ) { model->setData( index, edit->text() ) ; return ; } } // --- panel contain tablewidget #include <QtWidgets> #include <QSqlQueryModel> #include <QSqlQuery> #include "bookswindow.h++" #include "authordelegate.h++" #include "authoritem.h++" #include <iostream> #include <string.h> ......... void BooksWindow::createPanel() { qDebug() << "start of createPanel" ; panel = new QTableWidget( 1 , 1 , this ) ; panel->adjustSize() ; authorLabel = new QLabel( tr( "Author" ) ) ; authorLabel->setBuddy( panel ) ; panel->horizontalHeader()->hide() ; panel->verticalHeader()->hide() ; panel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); int width = panel->columnWidth( 0 ) ; panel->setColumnWidth( 0 , 3 * width ) ; panel->setItemPrototype( panel->item( 0 , 0 ) ) ; panel->setItemDelegate( new AuthorDelegate( this ) ) ; qDebug() << "BooksWindow::createPanel this: " << this ; fillHash() ; connect( panel , SIGNAL( itemChanged( QTableWidgetItem * ) ) , this , SLOT( checkPanelState( QTableWidgetItem * ) ) ) ; qDebug() << "end of createPanel" ; } void BooksWindow::keyPressEvent( QKeyEvent *event ) { if ( Qt::Key_Return == event->key() ) { qDebug() << "BooksWidow::kepPressEventKey pressed: Return" ; } else if ( Qt::Key_Enter == event->key() ) { qDebug() << "BooksWidow::kepPressEventKey pressed: Enter" ; } QWidget::keyPressEvent( event ) ; } void BooksWindow::checkPanelState( QTableWidgetItem * item ) { QString number( item->data( Qt::UserRole ).toString() ) ; QString name( item->text() ) ; int row = item->row() ; int column = item->column() ; int rowCount = panel->rowCount() ; // is this the last row, if so add another if ( ( ( rowCount - 1 ) == row ) && validateAuthor( name , row ) ) { panel->insertRow( rowCount ) ; QTableWidgetItem *item = panel->item( rowCount , 0 ) ; // set the author name item = static_cast<AuthorItem *>( panel->item( rowCount , 0 ) ) ; if ( !item ) { panel->setItem( rowCount , 0 , new AuthorItem( "" ) ) ; } else { item->setText( "" ) ; } panel->setFocus() ; panel->activateWindow() ; if ( panel->hasFocus() ) { qDebug() << "BooksWindow::checkPanelState has edit focus" ; } else { qDebug() << "BooksWindow::checkPanelState does not have edit focus" ; } } } bool BooksWindow::validateAuthor( QString &name , int row ) { // if it is a blank string, go no further if ( "" == name ) { return false ; } << name << "count:" << authorHash.count( name ) ; // see if this is a valid author. if not // blank if ( authorHash.contains( name ) ) { return true ; } else { QTableWidgetItem *item = panel->item( row , 0 ) ; if ( !item ) { panel->setItem( row , 0 , new AuthorItem( "" ) ) ; } else { item->setText( "" ) ; } return false ; } } void BooksWindow::fillHash() { int value ; QString key ; QString sql( "SELECT authNo , fullName FROM authorsView " ) ; sql.append( "ORDER BY authNo" ) ; QSqlQuery query( sql ) ; if ( ! query.exec( sql ) ) { showMessage( query ) ; } else { if ( ! query.first() ) { showMessage( query ) ; } else { key.clear() ; authorHash.clear() ; value = query.value( 0 ).toInt() ; key.append( query.value( 1 ).toString() ) ; authorHash[ key ] = value ; while ( query.next() ) { value = query.value( 0 ).toInt() ; key.clear() ; key.append( query.value( 1 ).toString() ) ; authorHash[ key ] = value ; } } query.finish() ; } } ............. @ Thanks for any input. _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest