crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как определить какой виджет(QComboBox) в QTableWidget изменился нажатием мыши?
Rocky
  опции профиля:
сообщение 3.2.2011, 11:27
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Есть таблица 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
  опции профиля:
сообщение 3.2.2011, 12:05
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 232 раз(а)




Репутация:   29  


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
  опции профиля:
сообщение 3.2.2011, 12:13
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(igor_bogomolov @ 3.2.2011, 12:05) *
objectName я бы точно не стал использовать. И вам бы не рекомендовал. Никогда не знаешь когда он реально понадобится, т.к. некоторые вещи без него не работают.

А в каких случаях он может понадобиться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 3.2.2011, 12:32
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 232 раз(а)




Репутация:   29  


Например для поиска объектов
T QObject::findChild ( const QString & name = QString() ) const
QList<T> qFindChildren ( const QObject * obj, const QString & name )


Есть еще какие то методы, но сейчас уже не могу вспомнить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.8.2017, 22:13