I have QTableView with QAbstractTableModel. Each second I download XML data from server and parse it and merge into QAbstractTableModel data. I have one column which can be edited by doubleclick - it is named "callsign".
When user wants to add new row into table he open modal dialog, fill fields and submit it.
My problem is following. After add dialog is closed I doblueclicking on "callsign" column. Edit control opens in cell but I can not enter any data in it! There is a sense that focus is missed on table. Is is missed in other form controls too. I push TAB but nothing happens.
Have anybody this problem?
This is code of my model:
{
if (role == Qt::DisplayRole) {
return m_TableData.getCellValue(index.row(), index.column());
}
if (role == Qt::EditRole) {
return m_TableData.getCellValue(index.row(), index.column());
}
if (role == Qt::BackgroundColorRole) {
return TxOrder
::getStatusColor(m_TableData.
getCellValue(index.
row(),
QString("order_status")).
toInt());
}
}
Qt
::ItemFlags TxOrderModel
::flags(const QModelIndex &index
) const{
QString columnName
= m_TableData.
getColumnName(index.
column());
if (columnName == "driver_callsign") {
flags |= Qt::ItemIsEditable;
}
return flags;
}
{
if (role == Qt::EditRole) {
QString columnName
= m_TableData.
getColumnName(index.
column());
if (columnName == "driver_callsign") {
QString primaryKey
= m_TableData.
getRowFieldValue(index.
row(), m_TableData.
getKeyField());
QString callsign
= value.
toString();
if (!callsign.isEmpty()) {
m_Order.setDriverToOrderByCallsign(primaryKey, callsign);
emit dataChanged(index, index);
}
}
}
return true;
}
QVariant TxOrderModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole) {
return m_TableData.getCellValue(index.row(), index.column());
}
if (role == Qt::EditRole) {
return m_TableData.getCellValue(index.row(), index.column());
}
if (role == Qt::BackgroundColorRole) {
return TxOrder::getStatusColor(m_TableData.getCellValue(index.row(), QString("order_status")).toInt());
}
return QVariant();
}
Qt::ItemFlags TxOrderModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
QString columnName = m_TableData.getColumnName(index.column());
if (columnName == "driver_callsign") {
flags |= Qt::ItemIsEditable;
}
return flags;
}
bool TxOrderModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role == Qt::EditRole) {
QString columnName = m_TableData.getColumnName(index.column());
if (columnName == "driver_callsign") {
QString primaryKey = m_TableData.getRowFieldValue(index.row(), m_TableData.getKeyField());
QString callsign = value.toString();
if (!callsign.isEmpty()) {
m_Order.setDriverToOrderByCallsign(primaryKey, callsign);
emit dataChanged(index, index);
}
}
}
return true;
}
To copy to clipboard, switch view to plain text mode
And this is how I open add dialog box:
void MainWindow::buttonEditOrderClick()
{
DialogOrderEdit dialog;
dialog.exec();
}
void MainWindow::buttonEditOrderClick()
{
DialogOrderEdit dialog;
dialog.exec();
}
To copy to clipboard, switch view to plain text mode
Dialog modal property is set to true.
Added after 24 minutes:
I have disabled all updates of data in table and comment code in model setData(). I found the way to reproduce this error:
1. Open window with QTableView.
2. Open modal dialog.
3. Close dialog.
4. Fast doubleclick to edit cell while dialog are closing.
Bookmarks