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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: как вставить в ячейку QTableWidget отображение password (буква заменена *)?  (Прочитано 16438 раз)
neosapient
Гость
« : Март 18, 2009, 15:38 »

Здравствуйте, есть таблица QTableWidget.
Как сделать так, чтобы в одном из столбцов отображались звездочки вместо букв?
Записан
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
Гость
« Ответ #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(), '*' ) );
}
}
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля 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
Гость
« Ответ #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, но что в её теле писать не представляю.
Записан
spirit
Гость
« Ответ #5 : Март 26, 2009, 13:22 »

так переопределите QItemDelegate::drawDisplay, что бы выводились "*".
Записан
neosapient
Гость
« Ответ #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);
    }
}

Хочется, чтобы всё было единообразно, и буквы подменялись черными кружками. Как мне это сделать ?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля 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
Гость
« Ответ #9 : Март 26, 2009, 14:38 »

А если так попробывать:
Спасибо, всё получилось
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Отлично!

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

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

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

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

Как Вы предлагаете решить сформулированную вами задачу ?
Хочу посмотреть как правильно это можно оформить.
Записан
spirit
Гость
« Ответ #12 : Март 26, 2009, 15:48 »

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

Сообщений: 2901



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

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

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

Тогда так...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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