目录
在开发中,需要设置QTableView、QTableWidget控件的列宽,但通过QTableView类的setColumnWidth函数设置列宽,发现不起作用。例如下代码不能改变第1列的列宽:
ui->groupGuaraTv>setColumnWidth(0, 400);
因为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
- #include "styleDelegate.h"
- #include
-
- CStyleDelegate::CStyleDelegate(QObject *parent)
- : QStyledItemDelegate(parent)
- {
-
- }
-
- QSize CStyleDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
- {
- auto colIndex = index.column();
- auto it = m_mpColumnWidth.find(colIndex);
- if(it == m_mpColumnWidth.end()) // 如果该列不需要设置列宽,就用代理项默认的列宽
- {
- return QStyledItemDelegate::sizeHint(option, index);
- }
- else // 如果该列需要设置列宽,就用设置的列宽
- {
- return QSize(it->second, option.rect.height());
- }
- }
-
- void CStyleDelegate::setColumnWidth(int columnIndex, int columnWidth)
- {
- m_mpColumnWidth[columnIndex] = columnWidth;
- }
-
styleDelegate.h
- #ifndef STYLE_DELEGATE_H
- #define STYLE_DELEGATE_H
-
- #include
- #include
- using std::map;
-
- class CStyleDelegate : public QStyledItemDelegate
- {
- Q_OBJECT
-
- public:
- explicit CStyleDelegate(QObject *parent = nullptr);
-
- public:
-
- /* 改变列宽度。
- * 注意:本函数仅仅对QTableView起作用,
- * 对QTreeView不起作用(这种情况下,用QTreeView自己的setColumnWidth函数)
- */
- void setColumnWidth(int columnIndex, int columnWidth);
-
- protected:
-
- virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
- private:
- map<int, int> m_mpColumnWidth; // 需要改变列宽的列索引和该列列宽的map
-
-
- };
-
- #endif // STYLE_DELEGATE_H
对QTableView对象设置列宽代码如下:
- #include"styleDelegate.h"
-
- // 构造一个代理类对象
- auto pFaultDelegate = new CStyleDelegate(this);
-
- // 将代理类对象设置到QTableView类ui->myTableView对象上
- ui->myTableView->setItemDelegate(pDelegate);
-
- // 改变列宽
- pFaultDelegate->setColumnWidth(0, 400);
- pFaultDelegate->setColumnWidth(1, 800);
-
-
上面的方法对QTreeView设置列宽不起作用,在这种情况下,用QTreeView自己的setColumnWidth函数设置列宽能起效果。