Как я могу создать QTableWidgetItem, выровненный по правому краю с длинным текстом, с эллипсами слева? - PullRequest
0 голосов
/ 02 ноября 2018

Предположим, у меня есть QTableWidget. Затем я создаю для него предметы

QString pathname="C:\\Directory1\\Directory2\\Directory3\\example.txt";
QTableWidgetItem*item=new QTableWidgetItem(pathname);
item->setTextAlignment(Qt::AlignVCenter | Qt::AlignRight);
ui->myTable->setItem(row, 1, item);

Если столбец является более узким, чем путь, то я получаю что-то вроде:

"C: \ Directory1 \ Dir ..."

Однако отображение столбца было бы гораздо более полезным, ИМХО, если бы оно было действительно выровнено по правому краю, поскольку конечная часть имени пути должна была быть выровнена с правой частью ячейки, а часть, которая не ' t, потому что ячейка была слишком узкой, была представлена ​​многоточием (то есть "...") слева, например

"... ectory3 \ example.txt"

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

Я понимаю, что мог бы позвонить, чтобы узнать, какая большая текстовая строка будет отображаться с текущим шрифтом, высотой, весом и т. Д. Затем я мог бы выполнять итерацию до тех пор, пока не найду максимально подходящие буквы; и установите его в приведенном выше коде только столько, сколько нужно.

Однако я бы предпочел использовать QStyledItemDelegate и использовать setItemDelegateForColumn (), сделать что-то подобное; или используйте таблицу стилей; таким образом, что базовые данные будут полным и правильным путем, но для его отображения он будет по-настоящему правильным, даже если столбец слишком узок для основного текста.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Хорошо, ребята, я нашел еще более простое решение. Только один метод для переопределения; и мне не нужно делать это для каждого предмета. Спасибо за помощь, tho.

После некоторого поиска и чтения кода в qitemdelegate.cpp я понял, что в QStyledItemDelegate есть метод setOptions. Я просто не мог понять, как параметры, которые он использовал, могли быть установлены или использованы (таким образом, полезным для этого?). Затем я попробовал другой поиск и наткнулся на:

Элидные режимы для QTreeView, QStandardItemModel

Ответ от wysota оказался одним из хороших ответов (хотя мне не нравится его гомогенизирующий девиз - можно подумать, что он работал на M $). Из этого я придумал:

class elideLeftItemC : public QStyledItemDelegate
{
    virtual void paint(QPainter *painter, const QStyleOptionViewItem &option,
      const QModelIndex &index) const
    {
        QStyleOptionViewItem opt = option;
        opt.textElideMode=Qt::ElideLeft;
        QStyledItemDelegate::paint(painter, opt, index);
    }
} elideLeftItem;

Тогда я просто использовал его следующим образом:

ui->twMyTable->setItemDelegateForColumn(0, &elideLeftItem);

Может быть способ назначить его еще дальше вверх по течению, но это неплохо. Я мог бы также проверить номера столбцов, как в ответе Wysota, но мне нравится, как он документирует, какие столбцы изменили делегаты, а какие нет. Dat be eet.

0 голосов
/ 02 ноября 2018

Для многоточия слева вы можете использовать QFontMetrics в качестве имени пути, и вы удаляете его слева с помощью Qt::ElideLeft.

QTableWidgetItem *item = new QTableWidgetItem();
// your metric
QFontMetrics metrics(item->font());
// your path
QString pathname = "C:\\Directory1\\Directory2\\Directory3\\example.txt";
// your elided path
QString elidedPathname = metrics.elidedText(pathname, Qt::ElideLeft, item->sizeHint().width());
// setting your new string in your item
item->setText(elidedPathname);
item->setTextAlignment(Qt::AlignVCenter | Qt::AlignRight);
ui->myTable->setItem(row, 1, item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...