Russian Qt Forum
Ноябрь 26, 2024, 20:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Установить значение QItemDelegate  (Прочитано 6871 раз)
braboar
Гость
« : Декабрь 02, 2010, 17:33 »

Создал я QItemDelegate от QComboBox, добавил туда (для примера) строки: "ttyS0", "ttyS1"  и т.д. Теперь мне бы хотелось установить, например, строку с ttyS1 из виджета, для которого этот делегат установлен, но как это сделать - не придумал. Как это реализовать? Заранее спасибо.
« Последнее редактирование: Декабрь 09, 2010, 12:49 от braboar » Записан
shirushizo
Гость
« Ответ #1 : Декабрь 02, 2010, 20:06 »

>>Создал я QItemDelegate от QComboBox
1. Не совсем понятно: создан QItemDelegate, у которого редактор QComboBox или void setItemDelegate (QAbstractItemDelegate * delegate)

>>добавил туда (для примера) строки: "ttyS0", "ttyS1"  и т.д.
Туда - это куда?! В комбобокс? в модель?

>>...из виджета, для которого этот делегат установлен
что за виджет? представление или комбобокс?

Непонимающий
Записан
braboar
Гость
« Ответ #2 : Декабрь 02, 2010, 21:46 »

Код:
class Propreties: public QTableWidget {
    // ...
    void addProperty() {
        ...
        QStringList rgStrings;
        rgStrins << "ttyS0" << "ttyS1" << "ttyS2" << "ttyS3";
        StringProperty* prop = newStringProp(..., rgStrings); // StringProp: public QItemDelegate
        setItemDelegateForRow(2, prop);
    }
};
Как-то так... А хочется:
Код:
class GlobalWidget {
    ...
    Properies* props;
    void setProp(...) {
        props->set("ttyS2");
    }
};
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Декабрь 03, 2010, 09:06 »

Ну что за народ...
Почему нельзя сразу по-нормальному всё описать.
И что хотите получить в результате.
Показывайте код наследника от QItemDelegate.
Каким образом мы должны догадаться что такое "props->set()" ?!
Толку от приведённого выше кода ровно 0.
Уважайте людей.
Записан

Qt 5.11/4.8.7 (X11/Win)
shirushizo
Гость
« Ответ #4 : Декабрь 03, 2010, 19:40 »

Давайте сначала  Улыбающийся
У вас есть наследник от QTableWidget. Есть наследник от QItemDelegate. Делегат установлен для определенной строки QTableWidget.
Теперь мне бы хотелось установить, например, строку с ttyS1 из виджета, для которого этот делегат установлен, но как это сделать - не придумал. Как это реализовать? Заранее спасибо.
Вам надо установить значение строки в таблице? Тогда есть метод void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item ).  Что-то вроде:
Код:
Propreties->setItem(2,1,new QTableWidgetItem ("ttyS1"));
Но тогда не понятно зачем делегат нужен... тем более "QItemDelegate от QComboBox"

Если вы хотите, чтобы по двойному щелчку по ячейке появился редактор QComboBox и там было ткеущеее значение "ttyS1", а в списке "ttyS0",,"ttyS1","ttyS2","ttyS3", то надо переопределить в делегате 3 функции
1.Создание редактора - создаем QComboBox со значениями "ttyS0",,"ttyS1","ttyS2","ttyS3"
Код:
createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index){
     QComboBox *editor=new QComboBox(this);
     editor.addItem("ttyS0");
     ...
     return editor;
}
2. Установка значения при начале редактирования
Код:
setEditorData(QWidget *editor, const QModelIndex &index)
{
     editor->setCurrentIndex(editor->findText("ttyS2"));//вместо этой строчки можно сделать извлечение данных из 
                                                                         //QTableWidget по index и выставление нужной строчки
}
Или я что-то так понял?
Записан
braboar
Гость
« Ответ #5 : Декабрь 07, 2010, 11:35 »

Если вы хотите, чтобы по двойному щелчку по ячейке появился редактор QComboBox и там было ткеущеее значение "ttyS1", а в списке "ttyS0",,"ttyS1","ttyS2","ttyS3", то надо переопределить в делегате 3 функции
1.Создание редактора - создаем QComboBox со значениями "ttyS0",,"ttyS1","ttyS2","ttyS3"
Код:
createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index){
     QComboBox *editor=new QComboBox(this);
     editor.addItem("ttyS0");
     ...
     return editor;
}
2. Установка значения при начале редактирования
Код:
setEditorData(QWidget *editor, const QModelIndex &index)
{
     editor->setCurrentIndex(editor->findText("ttyS2"));//вместо этой строчки можно сделать извлечение данных из 
                                                                         //QTableWidget по index и выставление нужной строчки
}
Или я что-то так понял?

Вы все поняли правильно. И я это реализовал, работает. Проблема в другом. Я бы хотел изменить строку в QComboBox, когда редактор не активен, но не нашел способа дотянуться до редактора. Т.е. itemDelegate() вернет мне мой делегат с QComboBox, но как установить нужную строчку в QComboBox? Заранее спасибо, Улыбающийся
Записан
shirushizo
Гость
« Ответ #6 : Декабрь 07, 2010, 19:59 »

То есть изменить элемент выпадающего списка у редактора-QComboBox?
Насчет красоты решения не уверен. Можно в делегате сохранить указатель на редактор. И описать метода(методы) для изменения элементов списка.
Код:
в h-файле
//...
QComboBox *editor;
//...

в cpp-файле
QWidget* createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index){
     editor=new QComboBox(this);
     editor.addItem("ttyS0");
     ...
     return editor;
}

void setList(const QStringList& list){
    editor->clear();
    editor->addItems(list);
}

bool setListItem(int index, const QString& item){
    if(index<0 || index>=editor->count()) return false;
    editor->setItemText(index, item);
    return false;
}
//по аналогии удаление и что-нибудь еще
Записан
braboar
Гость
« Ответ #7 : Декабрь 08, 2010, 21:57 »

shirushizo, спасибо! Я не догадался сохранить указатель на редактор.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.