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

这篇博客适合QT初学者,讲述了如何在自定义的FreezeTableWidget中获取QTableView选定行号的问题。通过连接信号和槽,当用户点击单元格时,尝试弹出QMessageBox显示行号,但目前实现存在错误,作者请求帮助解决。

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

我是QT新手。我使用的是从QTableView派生的FrozenTabelWidget。如何获得选定的行号。如果索引更改(用户单击任何单元格),那么我需要获取该单元格行号?如何从QTableView中获取选定的行号?

我的代码如下:

//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();

} 现在

如果我点击任何单元格我尝试显示QMessageBox提示,但它不工作。请帮我解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值