crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как узнать об изменении "сложных" ячеек таблицы?
Rocky
  опции профиля:
сообщение 27.12.2008, 18:37
Сообщение #1


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

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

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




Репутация:   7  


Есть QTableWidget. В некоторых столбцах размещены чекбоксы, в некоторых комбобоксы, в некоторых QDateTimeEdit. Есть и обычные ячейки. При изменнеии любой информации в любой ячейке мне нужно об этом узнавать. Как поступить? Пробовал перехватывать сигналы itemChanged(...) и cellChanged(...). Слоты, поставленные мной для этих сигналов вызываются только при изменении текста в обычных ячейках. А если менять дату, например, то слоты не вызываются. Какие есть методы, чтобы узнать об изменении?

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 18:52
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Rocky @ 27.12.2008, 21:37) *
В некоторых столбцах размещены чекбоксы, в некоторых комбобоксы, в некоторых QDateTimeEdit.
а как это реализовано, через делегаты?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.12.2008, 19:09
Сообщение #3


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

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

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




Репутация:   7  


Реализовано так:
void Lintex::CMainWindow::InsertRowInTasksTable(const int& nRow, const TTask& oTask)
{
    m_pTasksTable->insertRow(nRow);

    QTableWidgetItem *pItem0 = new QTableWidgetItem(oTask.sCurrentDate);
    QTableWidgetItem *pItem1 = new QTableWidgetItem("");
    QTableWidgetItem *pItem2 = new QTableWidgetItem(oTask.sAuthor);
    QTableWidgetItem *pItem3 = new QTableWidgetItem("");

    m_pTasksTable->setItem(nRow, 0, pItem0);
    ...
    m_pTasksTable->setItem(nRow, 3, pItem3);

    //назначенная дата выполнения
    QDateEdit *pDateMustBeDone = new QDateEdit();
    pDateMustBeDone->setCalendarPopup(true);
    pDateMustBeDone->setDate(QDate().fromString(oTask.sTaskDate));
    m_pTasksTable->setCellWidget(nRow, 1, pDateMustBeDone);

    //тип контакта
    QComboBox *pTaskTypeCmb = new QComboBox();
    pTaskTypeCmb->setEditable(true);
    pTaskTypeCmb->addItem(QApplication::tr("обзвон"));
    pTaskTypeCmb->addItem(QApplication::tr("письмо"));
    pTaskTypeCmb->addItem(QApplication::tr("звонок"));
    pTaskTypeCmb->addItem(QApplication::tr("визит"));
    m_pTasksTable->setCellWidget(nRow, 3, pTaskTypeCmb);
    const int nPos = pTaskTypeCmb->findText(oTask.sTaskType);
    if (nPos != -1) pTaskTypeCmb->setCurrentIndex(nPos);
    else     
    {
        pTaskTypeCmb->addItem(oTask.sTaskType);
        const int nPos1 = pTaskTypeCmb->findText(oTask.sTaskType);
        pTaskTypeCmb->setCurrentIndex(nPos1);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 19:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Можно пойти методом научного тыка, проверить срабатывают ли сигналы:
void cellClicked ( int row, int column )
void cellDoubleClicked ( int row, int column )
void cellEntered ( int row, int column )
void cellPressed ( int row, int column )

void currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )
void currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous )

void itemClicked ( QTableWidgetItem * item )
void itemDoubleClicked ( QTableWidgetItem * item )
void itemEntered ( QTableWidgetItem * item )
void itemPressed ( QTableWidgetItem * item )

:rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.12.2008, 19:58
Сообщение #5


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

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

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




Репутация:   7  


Попробовал все... ни фига. Вызываются только при изменении характеристик самих ячеек таблицы.... Видимо, тут нужно ловить сигналы от тех элементов управления, которые я добавил в табицу ....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 20:14
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Rocky @ 27.12.2008, 22:58) *
нужно ловить сигналы от тех элементов управления
я думаю это геморойно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.12.2008, 23:26
Сообщение #7


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

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

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




Репутация:   7  


Да, я терь знаю, что таблица изменилась, но вся нехорошесть в том, что из слотов, которые вызываются при изменении инфы в виджетах, вставленных в таблицу, никак не узнать, какая именно строка подвергается изменению.... Ловить при этом QTableWidget::cellClicked(...) толку не имеет.... не вызывается... Короче муть.... Мне просто надо в базу данных заносить всю эту таблицу, вот я решил сразу это делать, на лету так сказать.... Надо думать терь как по-другому сделать... Просто очень не хочется делать кнопку, чтоб человек нажимал сохранить...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 23:44
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Rocky @ 28.12.2008, 2:26) *
Мне просто надо в базу данных заносить всю эту таблицу, вот я решил сразу это делать, на лету так сказать
дак зачем же ты виджет испольовал? Надо было представление использовать!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 28.12.2008, 0:14
Сообщение #9


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

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

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




Репутация:   7  


А функциональность при этом не изменится? В смысле чтоб не просто были соответсвующие базе данных ячейки, а ячейки с виджетами? Надо тогда по-подробнее про представления почитать..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.12.2008, 0:31
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Rocky @ 28.12.2008, 3:14) *
а ячейки с виджетами?
это через делегаты делается

К стати посмотрел пример %QTDIR%\examples\itemviews\stardelegate там через табличный виджет сделано, я почему-то думал, что через табличное представление.

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

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


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




RSS Текстовая версия Сейчас: 26.4.2024, 2:56