使QTableView自动换行的要点有两个:
1 wordWrap属性为true
2 每次更新显示的内容后,要调用resizeRowsToContents()
下面的例子展示了自动换行的办法:(完整的代码在我的资源中下载)
#include "TableImgKnowledge.h"
#include <QHeaderView>
const int iMaxTableRowCount = 100;
TableWrap::TableWrap(QWidget *parent) : QTableView(parent)
{
setModel(&m_model);
setStyleSheet(QLatin1String("QHeaderView::section {\n"
" background:#1F48C3FA;\n"
"}"));
//auto pD = new WrapTextDelegate();
//setItemDelegateForColumn(1,pD);
setWordWrap(true);
horizontalHeader()->setStretchLastSection(true);
verticalHeader()->setVisible(false);
}
void TableWrap::vSetInfo(QList<QPair<QString, QString>> & lst)
{
m_model.vSetInfo(lst);
resizeRowsToContents();
}
QString TableWrap::qstrGetID(void)
{
return m_qstrID;
}
QStringList TableWrap::qstrlstGetPicType(void)
{
return m_qstrlstPicType;
}
//Model
ModelWrap::ModelWrap(QObject *parent) : QAbstractTableModel(parent)
{
for (int k = 0; k < iMaxTableRowCount; k++)
m_mapData.append(QPair<QString, QString>(QString(""), QString("")));
}
int ModelWrap::rowCount(const QModelIndex &) const
{
return m_mapData.size();
}
int ModelWrap::columnCount(const QModelIndex &) const
{
return 2;
}
QVariant ModelWrap::data(const QModelIndex &index, int role) const
{
int i = index.row(), j = index.column();
if ((i >= 0) && (i < m_mapData.size()))
{
if(role == Qt::DisplayRole)
{
if (0 == j)
{
QPair<QString, QString> pr = m_mapData.at(i);
if (pr.first.compare("Num") == 0)
{
return QString::fromWCharArray(L"����");
}
else
{
return pr.first;
}
}
else if (1 == j)
{
return m_mapData.at(i).second;
}
}
}
else if(role == Qt::TextAlignmentRole)
return Qt::AlignCenter;
return QVariant();
}
QVariant ModelWrap::headerData(int section, Qt::Orientation orientation, int role) const
{
if(role == Qt::DisplayRole)
{
if(orientation == Qt::Horizontal)
{
switch(section)
{
case 0:
return QString::fromWCharArray(L"����");
case 1:
return QString::fromWCharArray(L"����");
default:
break;
}
}
}
else if(role == Qt::TextAlignmentRole)
{
return Qt::AlignCenter;
}
return QAbstractTableModel::headerData(section, orientation, role);
}
void ModelWrap::vSetInfo(QList<QPair<QString, QString>> & map)
{
m_mapData.clear();
int iCount = map.size(), iRealCount = 0;
for (int k = 0; k < iCount; k++)
{
m_mapData.append(map.at(k));
++iRealCount;
}
int iLeftOver = 100 - iRealCount;
for (int k = 0; k < iLeftOver; k++)
{
m_mapData.append(QPair<QString, QString>(QString(""), QString("")));
}
emit dataChanged(createIndex(0, 0), createIndex(m_mapData.size() - 1, 1));
}
/*QString qstrGetSpacedText()
{
QString text = index.model()->data(index, Qt::DisplayRole).toString();
QFontMetrics fm = painter->fontMetrics();
int iAvrWidth = fm.averageCharWidth();
QStringList lst;
int iNum = text.length() > 5 ? option.rect.width() / iAvrWidth - 5 : text.length();
int iTotal = 0;
while(iTotal < text.length())
{
lst << text.mid(iTotal, iNum);
iTotal += iNum;
}
return
}*/
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QStringList>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
QVBoxLayout * pVLayout = new QVBoxLayout;
m_pTable = new TableWrap;
pVLayout->addWidget(m_pTable);
setLayout(pVLayout);
m_pBtn = new QPushButton;
pVLayout->addWidget(m_pBtn);
connect(m_pBtn, &QPushButton::clicked, [this](){
QList<QPair<QString, QString>> lst;
lst.append(QPair<QString, QString>("Num", QString::fromWCharArray(L"少年休笑白头翁花开能有几日红")));
m_pTable->vSetInfo(lst);
});
}
MainWindow::~MainWindow()
{
}
效果:
点击窗体的按钮后,表格中出现“少年休笑白头翁花开能有几日红”,且文字根据列宽度换行。行高度也随之增加。
最后几个字还是没显示出来,解决办法见我的另一篇博客《设置QTableView的内容自动换行(2)》。

2597

被折叠的 条评论
为什么被折叠?



