Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] QTableWidget and setText of cellClicked 
V
    Опции темы
devmstr
Дата 14.11.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Нужно по щелчку мыши установить некоторый текст для ячейки QTableWidget. Написал следующий код:

QObject::connect(ui.twLab, SIGNAL(cellClicked(int, int)), this, SLOT(twLabCellClicked(int, int)));

Код

/**
 * Slot for processing mouse click on the table cell
 */
void MyTable::twLabCellClicked(int Row, int Col)
{
        QTableWidgetItem* qtbItem = ui.twLab->item(Row, Col);
        qtbItem->setText(QString("-1"));
}

Но пощелчку мыши приложение просто закрывается.... что я не так сделал...


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
JackYF
Дата 14.11.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(devmstr @  14.11.2007,  23:53 Найти цитируемый пост)
мыши приложение просто закрывается.... что я не так сделал... 

ну ты хоть сначала в дебаг-режиме собери да посмотри, где оно вываливается...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
devmstr
Дата 15.11.2007, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Вываливается тут:
Код

inline void QTableWidgetItem::setText(const QString &atext)
{ setData(Qt::DisplayRole, atext); }
 
- qtablewidget.h при обработке целчка при присваивании setText,



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
nickless
Дата 15.11.2007, 00:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



devmstr, а qtbItem случайно не == NULL? smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
devmstr
Дата 15.11.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



nickless,
да действительно null, только не понятно почему  


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
nickless
Дата 15.11.2007, 01:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Цитата(devmstr @  14.11.2007,  23:07 Найти цитируемый пост)
только не понятно почему 

ui.twLab это что? Посмотри документацию к методу item() этого класса, возможно он возвращает NULL если Row, Col нет или там пусто.



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
JackYF
Дата 15.11.2007, 01:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(devmstr @  15.11.2007,  01:07 Найти цитируемый пост)
да действительно null, только не понятно почему   

а ты ему new сделал в конструкторе или где-то еще?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
devmstr
Дата 15.11.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Я и не знал что QTableWidgetItem надо создавать. Спасибо.
А нужно ли потом их перед закрытие программы или при изменении размеры таблицы удалять?  Я так понимаю что да?


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
bsa
Дата 15.11.2007, 23:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата
void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item )

Sets the item for the given row and column to item.

The table takes ownership of the item.
Может тебя еще заинтересует метод void QTableWidget::setItemPrototype(const QTableWidgetItem *item)
PM   Вверх
devmstr
Дата 16.11.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



twLab - QTableWidget
Все работает...
Код

/**
 * Prepare Control panel for working
 * Create connection beetween widgets
 */
void Lab1::prepareControlPanel()
{
    ui.twLab->setRowCount(ui.sbRowCount->value());
    ui.twLab->setColumnCount(ui.sbColCount->value());
    for (int it = 0; it < ui.twLab->rowCount(); it++)
        for (int jt = 0; jt < ui.twLab->columnCount(); jt++)
    {
            QTableWidgetItem* Item = new QTableWidgetItem();
            Item->setText(QString("0"));
            ui.twLab->setItem(it, jt, Item);
    }
    
    
    QObject::connect(ui.sbRowCount, SIGNAL(valueChanged(int)), this, SLOT(setTwLabRowCount(int)));
    QObject::connect(ui.sbColCount, SIGNAL(valueChanged(int)), this, SLOT(setTwLabColCount(int)));
    
    QObject::connect(ui.twLab, SIGNAL(cellClicked(int, int)), this, SLOT(twLabCellClicked(int, int)));
    
    for (int it = 0; it < ui.twLab->rowCount(); it++)
        ui.twLab->setRowHeight(it, CELL_HW);
    
    for (int it = 0; it < ui.twLab->columnCount(); it++)
        ui.twLab->setColumnWidth(it, CELL_HW);
}

/**
 * Slot for connection sbRowCount SpinBox and twLab RowCount
 */
void Lab1::setTwLabRowCount(int row)
{
    static int curRowCount = 0;
    
    
    if (curRowCount < row)
    {
        ui.twLab->setRowCount(row);

        ui.twLab->setRowHeight(row - 1, CELL_HW);
        ui.twLab->setColumnWidth(row -1, CELL_HW);
        for (int it = 0; it < ui.twLab->rowCount(); it++)
        {
            QTableWidgetItem* item = new QTableWidgetItem();
            item->setText(QString("0"));
            ui.twLab->setItem(row - 1, it, item);
        }
        curRowCount = row;
    }
    else if (curRowCount > row)
    {
        for (int it = 0; it < ui.twLab->rowCount(); it++)
        {
            delete(ui.twLab->item(row, it));
        }
        ui.twLab->setRowCount(row);
        curRowCount = row;
    }
    
    if (ui.btnSizeConnected->isChecked())
        ui.sbColCount->setValue(row);
}

/**
 * Slot for connection sbColCount SpinBox and twLab ColCount
 */
void Lab1::setTwLabColCount(int col)
{
    static int curColumnCount = 0;
    
    if (curColumnCount < col)
    {
        ui.twLab->setColumnCount(col);
            
        ui.twLab->setRowHeight(col - 1, CELL_HW);
        ui.twLab->setColumnWidth(col -1 , CELL_HW);
        for (int it = 0; it < ui.twLab->columnCount(); it++)
        {
            QTableWidgetItem* Item = new QTableWidgetItem();
            Item->setText(QString("0"));
            ui.twLab->setItem(it, col - 1, Item);
        }
        curColumnCount = col;
    }
    else if (curColumnCount > col)
    {
        for (int it = 0; it < ui.twLab->columnCount(); it++)
        {
            delete(ui.twLab->item(it, col));
        }
        ui.twLab->setColumnCount(col);
        curColumnCount = col;
    }
    
    if (ui.btnSizeConnected->isChecked())
        ui.sbRowCount->setValue(col);
}

Смущает только то, что во всех найденных примерах нигде QTableWidgetItem не удаляется... Так разве и надо? Я на всякий случай удалении сделал....

И еще попробовал, по совету bsa,так:
Код

QTableWidgetItem* item = new QTableWidgetItem();
item->setText(QString("0"));
    
ui.twLab->setItemPrototype(item);
ui.twLab->setRowCount(ui.sbRowCount->value());
ui.twLab->setColumnCount(ui.sbColCount->value());

Но ячейки остались пусты, хотя вроде все "по-честному"



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
bsa
Дата 16.11.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



devmstr, ты документацию в принципе не читаешь? Я тебе даже выделил кусок документации, в котором написано: "The table takes ownership of the item" - "таблица становится владельцем ячейки". Что значит "за уничтожением ячейки следит таблица".
Про setItemPrototype() написано, что ячейка создается, когда пользователь тыкает в нее мышкой:
Цитата
For example when the user is editing editing in an empty cell.
Хотя, я так понял, в любом случае создается экземпляр QTableWidgetItem, даже если прототип не задан.
PM   Вверх
devmstr
Дата 16.11.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Цитата(bsa @  16.11.2007,  11:48 Найти цитируемый пост)
The table takes ownership of the item

Извини, просто я не понял что владеет и сам освобождает, это тождественные понятия. Спасибо,что разъяснил smile)


Цитата(bsa @  16.11.2007,  11:48 Найти цитируемый пост)
ячейка создается, когда пользователь тыкает в нее мышкой

уже понял в чем причина, если убрать свой QObject::connect at onClick проблема решается... просто ячейка еще не успевает создасться... тоесть данный способ просто не подходит....

Огромное спасибо за ответы. Всем спасибо!


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.