0

I am trying to obscure passwords in my Qtableview in Qt. I tried :

QTableView view;
View.setItemDelegateForColumn(8,());

Also :

ui->tableView->setColumnhidden(8,true);

I know it's not right, just what I was trying to hide/obscure column 8.

user4157124
  • 2,809
  • 13
  • 27
  • 42
Pixal
  • 27
  • 6
  • `QTableView::setColumnHidden()` should work just fine. Do you get any error? Or what is the problem? Also note that columns are 0-indexed so column 8 has index 7. And make sure you capitalise the function names correctly, your sample contains typos. – HiFile.app - best file manager Sep 30 '22 at 10:15
  • No error, just simply does hide. – Pixal Oct 02 '22 at 22:09

1 Answers1

1

You can store password in item data. Something like this:

QString getPassword(QTableWidgetItem *itm)
{
    return itm->data(Qt::UserRole).toString();
}

void hidePassword(QTableWidgetItem *itm)
{
    QString password = getPassword(itm);
    password = password.fill('*', password.length());
    itm->setText(password);
    itm->setData(Qt::AccessibleTextRole, false);
}

void showPassword(QTableWidgetItem *itm)
{
    QString password = getPassword(itm);
    itm->setText(password);
    itm->setData(Qt::AccessibleTextRole, true);
}

void setPassword(QTableWidgetItem *itm, const QString &password)
{
    itm->setData(Qt::UserRole, password);
    if (itm->data(Qt::AccessibleTextRole) == true) {
        showPassword(itm);
    } else {
        hidePassword(itm);
    }
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTableWidgetItem *itm = new QTableWidgetItem();
    itm->setFlags(Qt::NoItemFlags);
    ui->tableWidget->setItem(0, 0, itm);

    setPassword(itm, "test");

    connect(ui->tableWidget, &QTableWidget::itemClicked, this, [itm](QTableWidgetItem *clickedItm){
        if (clickedItm == itm) {
            if (itm->data(Qt::AccessibleTextRole) == true) {
                hidePassword(itm);
            } else {
                showPassword(itm);
            }
        }
    });
}

I also used Qt::AccessibleTextRole to store whether the password is shown or not, it seems to be free

banana_cat
  • 46
  • 4