设置QTableView的内容自动换行(1)

使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)》。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值