Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как определить какой виджет(QComboBox) в QTableWidget изменился нажатием мыши?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Rocky
Есть таблица QTableWidget. В ячейках висят QComboBox-ы, в которых задана модель QSqlTableModel. Задача - при изменении данных в QComboBox нужно изменить ячейку в таблице, находящуюся на том же ряде что и сам QComboBox. Подумал что можно было бы через setData::UserRole запихивать номер строки при создании QComboBox... Но QSqlTableModel видимо не работает ни с чем, кроме как с отображаемыми данными. Поэтому
1. Нужно наследоваться от QSqlTableModel и дополнять то что нужно...
2. Можно наследоваться от QComboBox и при создании пихать номер строки в его мемберы...

Но наследоваться как-то не хочется... Думал-думал, сделал так:
Раскрывающийся текст
const int nNumRows = m_pTableWidget->rowCount();
m_pTableWidget->insertRow(nNumRows);

QComboBox *pComboBox = new QComboBox();
QSqlTableModel *pModel = new QSqlTableModel();
pModel->setTable(....);
pModel->select();
pComboBox->setModel(pModel);
.......
pComboBox->setObjectName(QString::number(nNumRows)); //!!!!!
.......
m_pTableWidget->setCellWidget(nNumRows, 0, pComboBox);
QObject::connect(pComboBox, SIGNAL(currentIndexChanged(const QString&)), SLOT(slotChange()));

slotChange()
{
    QObject* pObj = QObject::sender();
    QComboBox *pComboBox = qobject_cast<QComboBox*>(pObj);
    if (!pComboBox) return;
    
    QSqlTableModel *pModel = qobject_cast<QSqlTableModel*>(pComboBox->model());
    if (!pModel) return;

    const int nRow = pComboBox->objectName().toInt();
    QTableWidgetItem *pItem = m_pTableWidget->item(nRow, 3);
    if (!pItem) return;

    QModelIndex oIndex = pModel->index(pComboBox->currentIndex(), 2);
    pItem->setText(pModel->data(oIndex).toString());
}

Т.е. я сделал передачу номера строки через setObjectName..... Это хак? )) На что это может повлиять (в смысле может что-нить сломаться)? Или кто-нибудь знает, есть ли еще какой-нить более правильный вариант?
igor_bogomolov
objectName я бы точно не стал использовать. И вам бы не рекомендовал. Никогда не знаешь когда он реально понадобится, т.к. некоторые вещи без него не работают. Лучше используйте
bool QObject::setProperty ( const char * name, const QVariant & value )
QVariant QObject::property ( const char * name ) const
Цитата(Rocky @ 3.2.2011, 11:27) *
Или кто-нибудь знает, есть ли еще какой-нить более правильный вариант?
Может и есть, не знаю. Я когда то делал так же, только через property, и считаю это решение нормальным
Rocky
Цитата(igor_bogomolov @ 3.2.2011, 12:05) *
objectName я бы точно не стал использовать. И вам бы не рекомендовал. Никогда не знаешь когда он реально понадобится, т.к. некоторые вещи без него не работают.

А в каких случаях он может понадобиться?
igor_bogomolov
Например для поиска объектов
T QObject::findChild ( const QString & name = QString() ) const
QList<T> qFindChildren ( const QObject * obj, const QString & name )


Есть еще какие то методы, но сейчас уже не могу вспомнить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.