QTableWidget单元格自动分行显示

引言

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中使用各种自定义委托

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以通过设置QTableWidget单元的对齐方式来实现居中显示。具体的方法是: ``` tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter); // 水平居中 tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignVCenter); // 垂直居中 ``` 这样设置之后,QTableWidget中的单元控件就会自动居中显示了。如果需要对某个特定的单元进行居中显示,可以使用setItemAlignment()方法进行设置。例如: ``` QTableWidgetItem *item = new QTableWidgetItem("test"); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); tableWidget->setItem(0, 0, item); ``` 这样设置之后,第一行第一列的单元内容就会居中显示。 ### 回答2: 要使QTableWidget单元控件居中显示,可以通过设置单元的对齐方式来实现。 首先,使用QTableWidget的setItem()函数设置单元的内容时,可以使用QTableWidgetItem类创建一个表项,然后使用setAlignment()函数设置该表项的对齐方式。例如,可以使用Qt.AlignCenter参数将表项设置为居中对齐。 ```python item = QTableWidgetItem("内容") item.setTextAlignment(Qt.AlignCenter) tableWidget.setItem(row, column, item) ``` 此外,还可以通过setColumnWidth()和setRowHeight()函数设置表的列宽和行高来保证单元居中显示。例如,可以将所有列的宽度都设置为合适的大小,并将所有行的高度都设置为合适的大小。 ```python tableWidget.setColumnWidth(column, width) tableWidget.setRowHeight(row, height) ``` 通过以上方法,可以将QTableWidget单元控件居中显示,使表更加美观和易读。 ### 回答3: 要将QTableWidget单元的控件居中,可以使用QTableWidgetItem和setFlags()函数来实现。 首先,我们需要将要居中的控件创建为QTableWidgetItem对象。然后,通过调用setFlags()函数设置单元的对齐方式。在这个函数中,我们将Qt中的对齐方式Qt.AlignCenter设置为item的flags属性,表示控件应该在单元中居中对齐。 下面是代码示例: ```python # 导入必要的模块 from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QHeaderView from PyQt5.QtCore import Qt # 创建应用和主窗口 app = QApplication([]) window = QMainWindow() # 创建QTableWidget,并设置行列数 table = QTableWidget(3, 2) table.setHorizontalHeaderLabels(['Column A', 'Column B']) # 创建居中对齐的控件 item1 = QTableWidgetItem('Text 1') item1.setFlags(Qt.AlignCenter) item2 = QTableWidgetItem('Text 2') item2.setFlags(Qt.AlignCenter) # 将控件添加到指定的单元中 table.setItem(0, 0, item1) table.setItem(0, 1, item2) # 设置表头自适应大小和禁止编辑单元 table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) table.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) table.setEditTriggers(QTableWidget.NoEditTriggers) # 将表添加到主窗口中 window.setCentralWidget(table) # 显示主窗口 window.show() # 运行应用 app.exec_() ``` 在上述代码中,我们首先使用QTableWidgetItem创建了一个文本控件item1,并将其属性flags设置为居中对齐。然后,我们将这个控件添加到第一个单元(第0行第0列)中。同样地,我们通过设置第二个单元的控件属性flags实现了居中对齐。 最后,我们通过调用setSectionResizeMode()函数设置表头的大小自适应,并使用setEditTriggers()函数禁止了对单元的编辑。这样我们就实现了居中对齐的QTableWidget单元控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值