qtableview获取行数_如何从QTableView获取选定的行号?

本文介绍了一个名为FreezeTableWidget的自定义视图,它扩展了QTableView,实现列冻结功能。同时,展示了如何在QTableView中处理行选择变化,包括获取当前选中行的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//freezetablewidget.cpp

#include

#include "freezetablewidget.h"

FreezeTableWidget::FreezeTableWidget(QAbstractItemModel * model)

{

setModel(model);

frozenTableView = new QTableView(this);

init();

connect(horizontalHeader(),SIGNAL(sectionResized ( int ,int,int )), this,

SLOT(updateSectionWidth(int, int, int)));

connect(frozenTableView->verticalScrollBar(), SIGNAL(valueChanged(int)),

verticalScrollBar(), SLOT(setValue(int)));

connect(verticalScrollBar(), SIGNAL(valueChanged(int)),

frozenTableView->verticalScrollBar(), SLOT(setValue(int)));

}

FreezeTableWidget::~FreezeTableWidget()

{

delete frozenTableView;

}

void FreezeTableWidget::init()

{

frozenTableView->hideColumn(0);

frozenTableView->setModel(model());

frozenTableView->setFocusPolicy(Qt::NoFocus);

frozenTableView->verticalHeader()->hide();

frozenTableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);

viewport()->stackUnder(frozenTableView);

frozenTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

frozenTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

frozenTableView->show();

updateFrozenTableGeometry();

setHorizontalScrollMode(ScrollPerPixel);

setVerticalScrollMode(ScrollPerPixel);

frozenTableView->setVerticalScrollMode(ScrollPerPixel);

}

void FreezeTableWidget::currentChanged(const QModelIndex &current, const QModelIndex &previous)

{

QMessageBox::about(this,"Test","Hello");

}

void FreezeTableWidget::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)

{

QMessageBox::about(this,"Test","123456");

}

void FreezeTableWidget::updateSectionWidth(int logicalIndex, int, int newSize)

{

if(logicalIndex==0){

frozenTableView->setColumnWidth(0,newSize);

updateFrozenTableGeometry();

}

}

void FreezeTableWidget::updateSectionHeight(int logicalIndex, int, int newSize)

{

frozenTableView->setRowHeight(logicalIndex, newSize);

}

void FreezeTableWidget::resizeEvent(QResizeEvent * event)

{

QTableView::resizeEvent(event);

updateFrozenTableGeometry();

}

QModelIndex FreezeTableWidget::moveCursor(CursorAction cursorAction,

Qt::KeyboardModifiers modifiers)

{

QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);

if(cursorAction == MoveLeft && current.column()>0

&& visualRect(current).topLeft().x() < frozenTableView->columnWidth(0) ) {

const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()

- frozenTableView->columnWidth(0);

horizontalScrollBar()->setValue(newValue);

}

return current;

}

void FreezeTableWidget::updateFrozenTableGeometry()

{

frozenTableView->setGeometry(frameWidth(),

frameWidth(), this->width(),

viewport()->height()+horizontalHeader()->height());

}

//freezetablewidget.h

#ifndef FREEZETABLEWIDGET_H

#define FREEZETABLEWIDGET_H

#include

class FreezeTableWidget : public QTableView {

Q_OBJECT

public:

FreezeTableWidget(QAbstractItemModel * model);

~FreezeTableWidget();

protected:

virtual void resizeEvent(QResizeEvent *event);

virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);

void currentChanged(const QModelIndex &current, const QModelIndex &previous);

void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);

signals:

void indexChanged();

private:

QTableView *frozenTableView;

void init();

void updateFrozenTableGeometry();

private slots:

void updateSectionWidth(int logicalIndex,int, int newSize);

void updateSectionHeight(int logicalIndex, int, int newSize);

};

#endif

// Main .cpp

#include

#include

#include

#include

#include

#include "freezetablewidget.h"

int main( int argc, char** argv )

{

QApplication app( argc, argv );

QStandardItemModel *model=new QStandardItemModel();

QString line;

QStringList list;

line = "#,Name,Score,Sub1,Sub2,Sub4,Sub5,Sub6";

list= line.simplified().split(",");

model->setHorizontalHeaderLabels(list);

int row=0;

line="aaa,bbb,ccc,ddd";

list= line.simplified().split(",");

foreach(QString str,list) {

model->setItem(row ,0, new QStandardItem(QString::number(row + 1)));

model->setItem(row ,1, new QStandardItem(str));

model->setItem(row ,2, new QStandardItem("600"));

model->setItem(row ,3, new QStandardItem("5"));

model->setItem(row ,4, new QStandardItem("60"));

model->setItem(row ,5, new QStandardItem("100"));

model->setItem(row ,6, new QStandardItem("100"));

model->setItem(row ,7, new QStandardItem("NA"));

row++;

}

FreezeTableWidget *tableView = new FreezeTableWidget(model);

tableView->setWindowTitle(QObject::tr("Frozen Column Example"));

tableView->resize(900,200);

tableView->show();

return app.exec();

}

### 如何在 QTableView获取行高 在 PyQt 或 Qt 的 `QTableView` 组件中,可以通过调用特定的方法来获取某一行的高度。具体来说,可以使用 `rowHeight(int row)` 方法来返回指定行的高度[^1]。 以下是具体的实现方式: #### 使用 `rowHeight()` 方法 `QTableView` 提供了一个名为 `rowHeight(int row)` 的方法,该方法接受一个整数参数(表示行号),并返回对应行的高度(单位为像素)。如果给定的行不存在,则会抛出异常或者返回默认值[^2]。 下面是一个简单的代码示例展示如何获取某一行的高度: ```python from PyQt5.QtWidgets import QApplication, QTableView, QAbstractItemModel def get_row_height(table_view: QTableView, row_index: int): """ 获取指定行的高度 """ height = table_view.rowHeight(row_index) return height app = QApplication([]) # 假设已经创建好了一个 QTableView 实例 named_table_view named_table_view = QTableView() # 设置模型或其他初始化操作... model = QAbstractItemModel() named_table_view.setModel(model) # 调用函数获取第 0 行的高度 height_of_first_row = get_row_height(named_table_view, 0) print(f"The height of the first row is: {height_of_first_row} pixels.") ``` 上述代码定义了一个辅助函数 `get_row_height` 来封装对 `rowHeight` 方法的调用过程,并打印出了表格视图中第一行的高度。 需要注意的是,在实际应用过程中可能还需要考虑其他因素比如代理项绘制器 (`QStyledItemDelegate`) 对布局的影响以及动态调整后的最终效果等问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值