如何在调整 QTableView 大小时动态更改列数?

Posted

技术标签:

【中文标题】如何在调整 QTableView 大小时动态更改列数?【英文标题】:How to dynamically change the number of columns while resizing a QTableView? 【发布时间】:2019-02-19 07:27:05 【问题描述】:

当用户动态调整 QTableView 的大小时,是否可以更改 QTableView 中的列数?例如,我有 9 个编号为 1-9 的图像,我有一个带有自定义委托的 QTableView,它将图像绘制到表格的单元格中,我希望 QTableView 的行为如下图所示:

我的方向应该是什么,我应该如何实施?

【问题讨论】:

看起来你需要更多的布局而不是视图,不是吗? C++ 中有 flow layout example 和原生 flow layout in QML。 另外,您可能希望使用QListViewviewMode 设置为QListView::IconModeflow 设置为QListView::LeftToRight 您的表格视图有模型吗?您可以处理表格的调整大小事件,将当前表格宽度传递给模型并让它计算列数。然而,这种方法破坏了 MVC 模式,即模型不应该依赖于视图。 @G.M.我会采纳你的解决方案,谢谢你的回答 【参考方案1】:

这是我的解决方案代码:

QListViewIconModeLtoRFlow::QListViewIconModeLtoRFlow(QWidget *parent): QMainWindow(parent)

    ui.setupUi(this);

    QFrame *frame = new QFrame;
    QVBoxLayout *main = new QVBoxLayout(frame);

    QListView *list = new QListView;
    list->setFlow(QListView::LeftToRight);
    list->setResizeMode(QListView::Adjust);
    list->setViewMode(QListView::IconMode);
    list->setIconSize(QSize(50,50));

    QStandardItemModel *model = new QStandardItemModel;
    list->setModel(model);

    for (int i = 0; i < 50; ++i)
    
        QPixmap p("F:\\boro.jpg");
        QIcon *icon = new QIcon(p);
        QStandardItem *item = new QStandardItem(*icon, NULL); //NULL to hide string appearance
        model->appendRow(item);
    
    main->addWidget(list);
    setCentralWidget(frame);

如果 QStandardItem 像往常一样构造,则会在图标下方显示一个文本:

将 NULL 作为 QString 参数传递:

【讨论】:

以上是关于如何在调整 QTableView 大小时动态更改列数?的主要内容,如果未能解决你的问题,请参考以下文章

在QTableView中跨两个列跨越标题

如何更改 QTableView 图像大小

如何强制调整 indexWidgets 的大小以适合 Qt5 QTableView 的单元格

QTableView 列宽可调

如何根据内容调整 QTableView 的高度?

如何在窗口更改时动态调整applet组件的大小?