delegate paint

Russian Qt Forum
Май 28, 2014, 05:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
   
  •  
  •  
  •  
  •  
  •  
  •    
    Войти
  •     
      НАЧАЛО   ФОРУМ   WIKI (ВИКИ) FAQ ПОМОЩЬ ПОИСК ВОЙТИ РЕГИСТРАЦИЯ  

    Страниц: [12   Вниз
    ПЕЧАТЬ  
    Автор Тема: как вставить в ячейку QTableWidget отображение password (буква заменена *)?  (Прочитано 4348 раз)
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  : Март 18, 2009, 15:38 »
     

    Здравствуйте, есть таблица QTableWidget.
    Как сделать так, чтобы в одном из столбцов отображались звездочки вместо букв?
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    Rcus
    Гость
    «  Ответ #1 : Март 18, 2009, 15:49 »
     

    void QTableWidget::itemChanged ( QTableWidgetItem * item )   [signal]
    void QTableWidgetItem::setData ( int role, const QVariant & value )   [virtual]
    Qt::ItemDataRole
    QString::QString ( int size, QChar ch )
       Записан
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #2 : Март 18, 2009, 16:50 »
     

    Пожалуйста, уточните ваш совет.
    Попробовал, как вы сказали, теперь у меня звездочками затирается содержимое ячейки.

    Вопрос, как сохранить строку, и при этом отображать звездочки вместо букв  в QTableWidget ?

    Пока, у меня примерно следующее
    Код:
    QxMainDialog::QxMainDialog()
    {
    connect(TableParam, SIGNAL(itemChanged(QTableWidgetItem *)),this,SLOT(itemChanged(QTableWidgetItem *)));
    }
    ...
    void QxMainDialog::itemChanged ( QTableWidgetItem * item )
    {
    if(item->column()==3){ // выбираю третий столбец
    QString localbuf = item->text();
    qDebug() << localbuf;
    item->setData ( Qt::DisplayRole, QString::QString ( localbuf.size(), '*' ) );
    }
    }
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    pastor
    Administrator
    Джедай : наставник для всех
    * * * * *
    Offline  Offline

    Сообщений: 2898



    Просмотр профиля  WWW
    «  Ответ #3 : Март 18, 2009, 17:14 »
     

    Можно создать свой делегат на базе QItemDelegate, переопределить createEditor. В этом методе создать "редактор" из QLineEdit и для него утсановить Echo Mode QLineEdit::Password. Далее, устновить полученный делегат нужной колонке при помощи setItemDelegateForColumn. Подробнее как созадть делегат читай в ассистанте раздел  Delegate Classes
       Записан

    Integrated Computer Solutions, Inc. (ICS)
    http://www.ics.com/
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #4 : Март 26, 2009, 13:21 »
     

    Попробовал реализовать через делегат.
    Получилось вот 
    То есть, когда модифицируешь текст, символы подменяются, а вот в режиме просмотра символы НЕ подменяются. 
    Код:
    TrackDelegate::TrackDelegate(int durationColumn, QObject *parent)
        : QItemDelegate(parent)
    {
        this->durationColumn = durationColumn;
    }

    QWidget *TrackDelegate::createEditor(QWidget *parent,
            const QStyleOptionViewItem &option,
            const QModelIndex &index) const
    {
        if (index.column() == durationColumn) {
    QLineEdit *lineEdit = new QLineEdit(parent);
    lineEdit->setEchoMode(QLineEdit::Password);
            return lineEdit;
        } else {
            return QItemDelegate::createEditor(parent, option, index);
        }
    }

    Как я понимаю, надо подменить функцию paint, но что в её теле писать не представляю.
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    spirit
    Гость
    «  Ответ #5 : Март 26, 2009, 13:22 »
     

    так переопределите  QItemDelegate::drawDisplay, что бы выводились "*".
       Записан
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #6 : Март 26, 2009, 14:03 »
     

    Если переопределить QItemDelegate::drawDisplay, то '*' заменятся все поля 


    Если переопределить QItemDelegate::paint, то '*' заменятся только второй столбец, как и требуется.


    Код:
    void TrackDelegate::paint(QPainter *painter,
                              const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
    {
        if (index.column() == durationColumn) {
            QString text = index.model()->data(index, Qt::DisplayRole).toString();
            QString buf(text.size(),'*');

            drawDisplay(painter, option, option.rect, buf);
            drawFocus(painter, option, option.rect);
        } else{
            QItemDelegate::paint(painter, option, index);
        }
    }

    Хочется, чтобы всё было единообразно, и буквы подменялись черными кружками. Как мне это сделать ?
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    pastor
    Administrator
    Джедай : наставник для всех
    * * * * *
    Offline  Offline

    Сообщений: 2898



    Просмотр профиля  WWW
    «  Ответ #7 : Март 26, 2009, 14:10 »
     

    А если так попробывать:

    Код
    
                        
                        
    C++ (Qt)
    void TrackDelegate::paint(QPainter *painter,                          const QStyleOptionViewItem &option,                          const QModelIndex &index) const {    if (index.column() == durationColumn) {        QString text = index.model()->data(index, Qt::DisplayRole).toString();          QLineEdit edit;        edit.setText(text);        edit.setEchoMode(QLineEdit::Password);          drawDisplay(painter, option, option.rect, edit.displayText());        drawFocus(painter, option, option.rect);    } else{        QItemDelegate::paint(painter, option, index);    } }
       Записан

    Integrated Computer Solutions, Inc. (ICS)
    http://www.ics.com/
    spirit
    Гость
    «  Ответ #8 : Март 26, 2009, 14:11 »
     

    в  QItemDelegate::paint анализировать колонку и вызывать нативный  QItemDelegate::drawDisplay или же свой.  Улыбающийся
       Записан
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #9 : Март 26, 2009, 14:38 »
     

    А если так попробывать:
    Спасибо, всё получилось
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    pastor
    Administrator
    Джедай : наставник для всех
    * * * * *
    Offline  Offline

    Сообщений: 2898



    Просмотр профиля  WWW
    «  Ответ #10 : Март 26, 2009, 15:03 »
     

    Отлично!

    Тогда QLineEdit edit; можно сделать членом класса TrackDelegate, чтобы постоянно не создавать\удалять объект edit.
       Записан

    Integrated Computer Solutions, Inc. (ICS)
    http://www.ics.com/
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #11 : Март 26, 2009, 15:46 »
     

    Как я вас понял, вы предложили определить переменную QLineEdit edit; в классе TrackDelegate.

    но тут получается загвоздка с методами createEditor(...) const; и paint(...) const; так как они константные и не дают изменять значения переменной edit.

    Как Вы предлагаете решить сформулированную вами задачу ?
    Хочу посмотреть как правильно это можно оформить.
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
    spirit
    Гость
    «  Ответ #12 : Март 26, 2009, 15:48 »
     

    Код
    
                        
                        
    C++ (Qt)
    ... private:    mutable QLineEdit *lineEdit; ...  
       Записан
    pastor
    Administrator
    Джедай : наставник для всех
    * * * * *
    Offline  Offline

    Сообщений: 2898



    Просмотр профиля  WWW
    «  Ответ #13 : Март 26, 2009, 15:50 »
     

    Я предлагал вынести  edit только из  paint(...), чтобы исключить многокрантое создание\уничтожение объекта. createEditor(...)  не трогайте.
       Записан

    Integrated Computer Solutions, Inc. (ICS)
    http://www.ics.com/
    neosapient
    Самовар
    * *
    Offline  Offline

    Сообщений: 150


    Просмотр профиля
    «  Ответ #14 : Март 26, 2009, 16:05 »
     

    Тогда так...
       Записан

    QT 4.6.2 / WinXP, Vista, Win7, WinCE6  / VC6,VC9
     
    Страниц: [12   Вверх
    ПЕЧАТЬ  
     
    Перейти в: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •     

  • Страница сгенерирована за 1.425 секунд. Запросов: 22.
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值