引言
1.QTableWidget的单元格在编辑内容时只能单行显示,当单元格内容较多时不便于编辑;
2.单元格的长度在缩短到一定程度后,后面的内容会显示为...
查得可以用QStyleItemDelegate实现,记录如下。
代码实现
头文件
#include <QStyledItemDelegate>
class TextEditDelegate : public QStyledItemDelegate {
Q_OBJECT
public:
TextEditDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
实现文件:
#include <QTextEdit>
#include <QPainter>
TextEditDelegate::TextEditDelegate( QObject *parent)
{
}
QWidget *TextEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QTextEdit *editor = new QTextEdit(parent);
return editor;
}
void TextEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QTextEdit *newTextEdit= static_cast<QTextEdit*>(editor);
newTextEdit->setPlainText( value );
}
void TextEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QTextEdit *newTextEdit= static_cast<QTextEdit*>(editor);
QString value = newTextEdit->toPlainText();
model->setData(index, value, Qt::EditRole);
}
void TextEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
使用方法:
//初始化表格时新建代理,给目标单元格设置代理
TextEditDelegate * textEditer = new TextEditDelegate ;
//以下是给表格的第二、五列设置代理
ui_replay.tableWidget_frame->setItemDelegateForColumn(1,textEditer);
ui_replay.tableWidget_frame->setItemDelegateForColumn(5,textEditer);
效果:
拉伸窗口时自动调整行高
通过事件过滤器,拦截“拉伸窗口”事件,插入调整行高操作
//在头文件中声明事件过滤器
bool eventFilter(QObject *obj, QEvent *event);//事件过滤器
//实现文件中安装事件过滤器,在主窗口的tableWidget_frame的尺寸发生变化时进行截获并处理,调整行高
ui_replay.tableWidget_frame->installEventFilter(this);
//实现事件过滤
bool Replay::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui_replay.tableWidget_frame)//tableWidget_frame尺寸发生变化时调整行高
{
if(event->type() == QEvent::Resize)
{
ui_replay.tableWidget_frame->resizeRowsToContents();
}
}
//其它事件交基类处理
return QMainWindow::eventFilter(obj, event);
}
由于我是“拉伸填充”了整个表格,所以拉伸窗口直接对应着表格单元格宽度的变化。当然,也可以捕捉其他事件来处理调整行高。
//在初始化表格时设置第二列,拉伸填充表格
ui_replay.tableWidget_frame->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch);
参考
QTableWidget中实现表格的自动换行
怎样实现qtableview或者qtablewidget的单元格自动换行
Qt 学习之路 2(46):视图和委托
QT:在QTableView中使用各种自定义委托