Russian Qt Forum

Qt => Model-View (MV) => Тема начата: neosapient от Март 18, 2009, 15:38



Название: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 18, 2009, 15:38
Здравствуйте, есть таблица QTableWidget.
Как сделать так, чтобы в одном из столбцов отображались звездочки вместо букв?


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: Rcus от Март 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 )


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 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(), '*' ) );
}
}


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 18, 2009, 17:14
Можно создать свой делегат на базе QItemDelegate, переопределить createEditor. В этом методе создать "редактор" из QLineEdit и для него утсановить Echo Mode QLineEdit::Password. Далее, устновить полученный делегат нужной колонке при помощи setItemDelegateForColumn. Подробнее как созадть делегат читай в ассистанте раздел Delegate Classes


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 13:21
Попробовал реализовать через делегат.
Получилось вот (http://pic.ipicture.ru/uploads/090326/Un1WKWyRhX.jpg) (http://ipicture.ru/)
То есть, когда модифицируешь текст, символы подменяются, а вот в режиме просмотра символы НЕ подменяются.
Код:
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, но что в её теле писать не представляю.


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: spirit от Март 26, 2009, 13:22
так переопределите QItemDelegate::drawDisplay, что бы выводились "*".


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 14:03
Если переопределить QItemDelegate::drawDisplay, то '*' заменятся все поля
(http://pic.ipicture.ru/uploads/090326/5Ssmi96WUo.jpg) (http://ipicture.ru/)

Если переопределить QItemDelegate::paint, то '*' заменятся только второй столбец, как и требуется.
(http://pic.ipicture.ru/uploads/090326/5ujqIfzfW3.jpg) (http://ipicture.ru/)

Код:
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);
    }
}

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


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 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);
   }
}


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: spirit от Март 26, 2009, 14:11
в QItemDelegate::paint анализировать колонку и вызывать нативный QItemDelegate::drawDisplay или же свой. :)


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 14:38
А если так попробывать:
Спасибо, всё получилось
(http://pic.ipicture.ru/uploads/090326/rWmS5ktRMZ.jpg) (http://ipicture.ru/)


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 26, 2009, 15:03
Отлично!

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


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 15:46
Как я вас понял, вы предложили определить переменную QLineEdit edit; в классе TrackDelegate.

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

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


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: spirit от Март 26, 2009, 15:48
Код
C++ (Qt)
...
private:
   mutable QLineEdit *lineEdit;
...
 


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 26, 2009, 15:50
Я предлагал вынести edit только из paint(...), чтобы исключить многокрантое создание\уничтожение объекта. createEditor(...)  не трогайте.


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 16:05
Тогда так...


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 26, 2009, 16:08
Лучше так:

mutable QLineEdit *edit;

....

edit = new QLineEdit(this);
edit->setEchoMode(QLineEdit::Password);

...

edit->setText(text);
drawDisplay(painter, option, option.rect, edit->displayText());


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: spirit от Март 26, 2009, 16:10
ага, так. только почему бы не хранить указатель и убрать инклуд  #include <QLineEdit> из ашника?


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: spirit от Март 26, 2009, 16:10
@pastor, ну ты шустрый, блин.  :)


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 16:20
Ну или так...


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 26, 2009, 16:24
Ну или так...

ага, оно. А про hide я забыл )

Кстате, можешь смело писать

edit = new QLineEdit(parent);

вместо

edit = new QLineEdit((QWidget *)parent);


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 16:32
Не могу, компилятор ругается на несоответствие типов QObject и QWidget.

Ещё раз спасибо!


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: pastor от Март 26, 2009, 16:37
А на какую строку ругается?  Вот твой код:

Код
C++ (Qt)
TrackDelegate::TrackDelegate(int durationColumn, QWidget *parent)
   : QItemDelegate(parent)
{
   edit = new QLineEdit((QWidget *)parent);
   ....
}

Проблем быть не должно если убрать (QWidget *)


Название: Re: как вставить в ячейку QTableWidget отображение password (буква заменена *)?
Отправлено: neosapient от Март 26, 2009, 16:38
Пересобрал, глюк исчез.