• QTableView、QTableWidget通过setColumnWidth改变列宽无效的问题解决


    目录

    1. 问题的提出

    2. 解决方法

    3. 注意的问题


    1. 问题的提出

           在开发中,需要设置QTableView、QTableWidget控件的列宽,但通过QTableView类的setColumnWidth函数设置列宽,发现不起作用。例如下代码不能改变第1列的列宽:

    ui->groupGuaraTv>setColumnWidth(0, 400);
    

    2. 解决方法

            因为QTableWidget是从QTableView继承,故本博文所说的技术点也适用于QTableWidget类,本博文以QTableView类来讲解。本博文用到了Qt的Model/View/Delegate 框架,如果对Qt的“模型/视图/委托”框架不懂,本博文很难读懂。如果不懂这方面的知识,请在Qt Assistant 中输入Model/View Programming 学习了解。读者本机Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\itemviews目录下有很多model/view framework的例子,可以进行自学了解,其中XX.XX.XX为Qt的版本号,如:5.14.1。

             先实现一个代理类,代码实现如下:

    styleDelegate.cpp

    1. #include "styleDelegate.h"
    2. #include
    3. CStyleDelegate::CStyleDelegate(QObject *parent)
    4. : QStyledItemDelegate(parent)
    5. {
    6. }
    7. QSize CStyleDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    8. {
    9. auto colIndex = index.column();
    10. auto it = m_mpColumnWidth.find(colIndex);
    11. if(it == m_mpColumnWidth.end()) // 如果该列不需要设置列宽,就用代理项默认的列宽
    12. {
    13. return QStyledItemDelegate::sizeHint(option, index);
    14. }
    15. else // 如果该列需要设置列宽,就用设置的列宽
    16. {
    17. return QSize(it->second, option.rect.height());
    18. }
    19. }
    20. void CStyleDelegate::setColumnWidth(int columnIndex, int columnWidth)
    21. {
    22. m_mpColumnWidth[columnIndex] = columnWidth;
    23. }

    styleDelegate.h

    1. #ifndef STYLE_DELEGATE_H
    2. #define STYLE_DELEGATE_H
    3. #include
    4. #include
    5. using std::map;
    6. class CStyleDelegate : public QStyledItemDelegate
    7. {
    8. Q_OBJECT
    9. public:
    10. explicit CStyleDelegate(QObject *parent = nullptr);
    11. public:
    12. /* 改变列宽度。
    13. * 注意:本函数仅仅对QTableView起作用,
    14. * 对QTreeView不起作用(这种情况下,用QTreeView自己的setColumnWidth函数)
    15. */
    16. void setColumnWidth(int columnIndex, int columnWidth);
    17. protected:
    18. virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    19. private:
    20. map<int, int> m_mpColumnWidth; // 需要改变列宽的列索引和该列列宽的map
    21. };
    22. #endif // STYLE_DELEGATE_H

    对QTableView对象设置列宽代码如下:

    1. #include"styleDelegate.h"
    2. // 构造一个代理类对象
    3. auto pFaultDelegate = new CStyleDelegate(this);
    4. // 将代理类对象设置到QTableView类ui->myTableView对象上
    5. ui->myTableView->setItemDelegate(pDelegate);
    6. // 改变列宽
    7. pFaultDelegate->setColumnWidth(0, 400);
    8. pFaultDelegate->setColumnWidth(1, 800);

    3. 注意的问题

         上面的方法对QTreeView设置列宽不起作用,在这种情况下,用QTreeView自己的setColumnWidth函数设置列宽能起效果。

  • 相关阅读:
    前端vue学习笔记(1)
    三维重建-第三方库介绍
    python 随机数生成
    python面向对象1--类、对象、属性、魔法方法
    奇异值分解(SVD)和np.linalg.svd()函数用法
    macOS电池续航工具:Endurance中文
    windows下redis设置redis开机自启动方法
    全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64,组织单位:(大数据与决策实验室)
    微机保护装置智能操控及无线测温等产品在某助剂厂新建项目的应用
    栈和队列的概念和实现
  • 原文地址:https://blog.csdn.net/danshiming/article/details/138167056