Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кнопка в QTableView, обработать clicked() 
V
    Опции темы
Sosed
Дата 5.8.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Имеется делегат, с помошью которого устанавливаю в таблицу столбец QPushButton'ов.
Собственно нужно по нажатию одного из QPushButton'a вызвать диалог, после закрытия которого записать данные в ячейку с вызвавшей его кнопкой.
Проблема в том что я запутался в MVC и немогу понять куда воткнуть connect для кнопки. Если его делать в методе делегата createEditor, то как записать данные в модель, в нужное место? Есть мысль хранить указатель на модель в классе делегата и использовать сигналмапер для коннекта кнопок, передавая номер строки, на которой расположена кнопка, столбец "вшить", он не меняется, соответственно зная точные координаты ячейки записать данные проблемы не составит. 
Но что-то не нравится мне этот указатель в классе делегата да и попахивает это решение. Как правильно сделать?

Это сообщение отредактировал(а) Sosed - 5.8.2010, 17:15
PM MAIL   Вверх
icecrashldr
Дата 5.8.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


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

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



Забыл как в QT присваеваются ID к кнопкам..
Вообщем идея в том, что бы по ID кнопки можно было вычислить номер строки, тогда получится динамика. smile
PM MAIL WWW   Вверх
Sosed
Дата 5.8.2010, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Класс делегата сейчас примерно такой
Код

class Delegate : public QItemDelegate {
    Q_OBJECT

public:
    Delegate(QObject* pobj) : QItemDelegate(pobj), model(0)
    {
        signalMapper = new QSignalMapper(this);
        connect(signalMapper, SIGNAL(mapped(int)),
                this, SLOT(openOptionDialog(int)));
        ...
    }

    QWidget *createEditor(QWidget *parent,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
    {
        if(index.column() == 4) {
            if(!model) model = index.model();
            QPushButton *pb = new QPushButton(parent);
            connect(pb, SIGNAL(clicked()), signalMapper, SLOT(map()));
            signalMapper->setMapping(pb, index.row());
            return pb;
        } else {
            return QItemDelegate::createEditor(parent, option, index);
        }
    }

  public slots:
    void openOptionDialog(int row) {
        OptionDialog od(model, row);
        od.exec();
    }

private:
    QSignalMapper *signalMapper;
    QAbstractItemModel *model;
};

Такое чувство что все эти манипуляции нужно делать где-то в другом месте.

Цитата

Забыл как в QT присваеваются ID к кнопкам..

да вроде никак) У меня проблему вычисления строки решает сигналмапер.

PM MAIL   Вверх
icecrashldr
Дата 6.8.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


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

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



Идея в том что бы для всех buttons поставить один слот, а в слоту разберать на какой button был клик. Либо можно пронаследоваться от QPushButton и добавить свои уникальные данные.
PM MAIL WWW   Вверх
borisbn
Дата 6.8.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(icecrashldr @  6.8.2010,  10:39 Найти цитируемый пост)
Либо можно пронаследоваться от QPushButton и добавить свои уникальные данные.

Наследоваться необязательно. Каждому объекту, наследованного от QObject, можно задать свойство типа так:
Код

btn->setProperty( "index", idx );

а в слоте вычитывать её
Код

void ObjName::onButton()
{
    int idx = sender()->property( "index" ).toInt();
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
icecrashldr
Дата 6.8.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


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

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



borisbn, Точно, точно smile
PM MAIL WWW   Вверх
Sosed
Дата 6.8.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



С индексами разобрались а как данные то записать?
С if(!model) model = index.model(); я немного опечатался, метод то const, да и вообще правильно ли хранить указатель на модель в делегате? Кнопка отображается с помощью openPersistentEditor, поэтому немогу засунуть код слота openOptionDialog в метод делегата setModelData, диалог появляется не сразу, а после щелчка на другой ячейке(
PM MAIL   Вверх
Sosed
Дата 7.8.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Скривившись сделал так
Код

void Delegate::openOptionDialog() {
    int row = sender()->property("row").toInt();
    int column = sender()->property("column").toInt();
    QTableView *tableView = qobject_cast<QTableView*>(sender()->parent()->parent());
    QAbstractItemModel *model = tableView->model();

    QString settings = model->index(row, column).data().toString();
    OptionDialog dialog(settings);
    if( dialog.exec() ) { //ok
        QVariant value(dialog.getSettings());
        model->setData(model->index(row, column), value, Qt::EditRole);
    }
}

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

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

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


 




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


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

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