Как предотвратить горизонтальную прокрутку QAbstractScrollArea/QTableView?

У меня есть QTableView и некоторый контент в нем. Мне нужно поведение, подобное horizontalHeader() -> setResizeMode( ResizeToContent ), но оно не должно создавать горизонтальные полосы прокрутки - я имею в виду, что область просмотра не должна быть шире таблицы.

Даже с созданием нового QHeaderView это не так просто, так как виртуальных методов всего несколько.

рисунок для визуализации проблемы

Заранее спасибо,

Чарли

PS: у меня есть пользовательский делегат элемента, который сокращает длинные тексты с помощью "...". Он возвращает как sizeHint() полный размер, но когда метод paint() получает меньший размер (например, смоделированный с помощью resizeMode() == Qt::Interactive), он обрезает содержимое.


person Charly    schedule 24.04.2012    source источник


Ответы (1)


Новый ответ

Вам нужно установить растяжку на отдельных участках, я создал простое тестовое приложение:

Скриншот теста

test.cpp

#include <QtGui>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QStandardItemModel mdl(3, 3); // rows, cols
    mdl.setHorizontalHeaderLabels(QStringList() << "Name" << "Size" << "Date");
    mdl.setItem(0, 0, new QStandardItem("Short name"));
    mdl.setItem(0, 1, new QStandardItem("25kb"));
    mdl.setItem(0, 2, new QStandardItem("2011/07/05"));
    mdl.setItem(1, 0, new QStandardItem("This is a long name"));
    mdl.setItem(1, 1, new QStandardItem("25kb"));
    mdl.setItem(1, 2, new QStandardItem("2011/07/05"));
    mdl.setItem(2, 0, new QStandardItem("This is a long long long long name"));
    mdl.setItem(2, 1, new QStandardItem("25kb"));
    mdl.setItem(2, 2, new QStandardItem("2011/07/05"));


    QTableView view;
    view.setModel(&mdl);
    QHeaderView* hdr = view.horizontalHeader();
    hdr->setResizeMode(0, QHeaderView::Stretch);
    hdr->setResizeMode(1, QHeaderView::ResizeToContents);
    hdr->setResizeMode(2, QHeaderView::ResizeToContents);

    view.show();
    return app.exec();
}

test.pro

QT += core gui
SOURCES=test.cpp

Примечание. Важно, чтобы void QHeaderView::setResizeMode(int, ResizeMode) вызывался, когда этот логический индекс существует, то есть когда модель, определяющая эти столбцы, присоединена к представлению.


Старый ответ

QAbstractScrollArea имеет свойство horizontalScrollBarPolicy, которое может иметь параметр ScrollBarAlwaysOff.

Попробуйте что-то вроде:

QAbstractScrollArea* scrollArea = // ???
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

person Silas Parker    schedule 24.04.2012
comment
Использование ScrollBarAlwaysOff имеет другой эффект. Он просто скрывает полосу прокрутки, но не влияет на размер столбца или, по крайней мере, не решает проблему. - person Charly; 25.04.2012
comment
Как насчет того, чтобы также установить свойства resizeMode в ResizeToContent и stretchLastSection в true? Вы можете добавить эскиз/рисунок/макет в свой пост, чтобы проиллюстрировать, чего вы пытаетесь достичь. - person Silas Parker; 25.04.2012
comment
Хорошо, я подготовлю чертеж. ResizeToContent и strechLastSection(true) не помогает... - person Charly; 25.04.2012
comment
Тестовое приложение работает нормально, мое «настоящее приложение» не работает... но это то, что я могу понять сам. Спасибо большое! - person Charly; 25.04.2012
comment
это не сработало, потому что я установил режим изменения размера за раз, когда модель не была прикреплена - таким образом, в таблице нет столбцов, и эти данные были потеряны. Я добавил этот пункт к вашему ответу... - person Charly; 25.04.2012