如何从QTableView获取所选行号?
我是新来的。我使用的是如何从QTableView获取所选行号?,qt,Qt,我是新来的。我使用的是FrozenTabelWidget它来自QTableView。如何获取选定的行号。如果索引更改(用户单击任何单元格),那么我需要获取该单元格的行号吗 我的代码如下: //freezetablewidget.cpp #include <QtGui> #include "freezetablewidget.h" FreezeTableWidget::FreezeTableWidget(QAbstractItemModel * model) {
FrozenTabelWidget
它来自QTableView
。如何获取选定的行号。如果索引更改(用户单击任何单元格),那么我需要获取该单元格的行号吗
我的代码如下:
//freezetablewidget.cpp
#include <QtGui>
#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 ¤t, 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 <QTableView>
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 ¤t, 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 <QApplication>
#include <QStandardItemModel>
#include <QFile>
#include <QDir>
#include <QDebug>
#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();
}
//freezetablewidget.cpp
#包括
#包括“freezetablewidget.h”
冻结表小部件::冻结表小部件(QAbstractItemModel*模型)
{
setModel(model);
frozenTableView=新的QTableView(此);
init();
连接(horizontalHeader(),信号(已调整节大小(int,int,int)),此,
槽(updateSectionWidth(int,int,int));
连接(frozenTableView->verticalScrollBar(),信号(valueChanged(int)),
垂直滚动条(),插槽(设置值(int));
连接(垂直滚动条(),信号(值已更改(int)),
frozenTableView->verticalScrollBar(),插槽(setValue(int));
}
冻结表小部件::~冻结表小部件()
{
删除冻结表视图;
}
void FreezeTableWidget::init()
{
frozenTableView->hideColumn(0);
frozenTableView->setModel(model());
frozenTableView->setFocusPolicy(Qt::NoFocus);
frozenTableView->verticalHeader()->隐藏();
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();
设置水平滚动模式(滚动每像素);
设置垂直滚动模式(每像素滚动);
frozenTableView->setVerticalScrollMode(ScrollPerPixel);
}
void FreezeTableWidget::currentChanged(常量QModelIndex¤t,常量QModelIndex&previous)
{
QMessageBox::关于(这个,“测试”,“你好”);
}
void FreezeTableWidget::selectionChanged(常量QItemSelection&selected,常量QItemSelection&deselected)
{
QMessageBox::关于(这个,“测试”,“123456”);
}
void FreezeTableWidget::updateSectionWidth(int-logicalIndex,int,int-newSize)
{
如果(logicalIndex==0){
frozenTableView->setColumnWidth(0,新闻大小);
updateFrozenTableGeometry();
}
}
void FreezeTableWidget::updateSectionHeight(int-logicalIndex,int,int-newSize)
{
frozenTableView->setRowHeight(logicalIndex,newSize);
}
void FreezeTableWidget::resizeEvent(QResizeEvent*event)
{
QTableView::resizeEvent(事件);
updateFrozenTableGeometry();
}
QModelIndex FreezeTableWidget::moveCursor(CursorAction CursorAction,
Qt::键盘修改器(键盘修改器)
{
QModelIndex current=QTableView::moveCursor(cursorAction,修饰符);
如果(cursorAction==MoveLeft&¤t.column()>0
&&visualRect(当前).topLeft().x()columnWidth(0)){
const int newValue=horizontalScrollBar()->value()+visualRect(当前).topLeft().x()
-frozenTableView->columnWidth(0);
水平滚动条()->setValue(newValue);
}
回流;
}
void FreezeTableWidget::updateFrozenTableGeometry()
{
frozenTableView->setGeometry(frameWidth(),
frameWidth(),此->宽度(),
viewport()->height()+horizontalHeader()->height());
}
//冻结表控件
#ifndef冻结表
#定义冻结表窗口小部件
#包括
类冻结表小部件:公共QTableView{
Q_对象
公众:
冻结表小部件(QAbstracteModel*模型);
~FreezeTableWidget();
受保护的:
虚拟void resizeEvent(QResizeEvent*事件);
虚拟QModelIndex moveCursor(CursorAction CursorAction,Qt::KeyboardModifiers修饰符);
void currentChanged(常数QModelIndex&当前,常数QModelIndex&以前);
无效选择已更改(常量QItemSelection&selected,常量QItemSelection&Diselected);
信号:
void indexChanged();
私人:
QTableView*冻结表视图;
void init();
void updateFrozenTableGeometry();
专用插槽:
void updateSectionWidth(int-logicalIndex,int,int-newSize);
void updateSectionHeight(int-logicalIndex,int,int-newSize);
};
#恩迪夫
//Main.cpp
#包括
#包括
#包括
#包括
#包括
#包括“freezetablewidget.h”
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
QStandardItemModel*model=新QStandardItemModel();
QString线;
QStringList表;
行=“#,名称,分数,Sub1,Sub2,Sub4,Sub5,Sub6”;
list=line.simplified().split(“,”);
模型->设置水平表头标签(列表);
int行=0;
line=“aaa、bbb、ccc、ddd”;
list=line.simplified().split(“,”);
foreach(QString str,list){
model->setItem(行,0,新的QStandardItem(QString::number(行+1));
模型->设置项(第1行,新QS标准项(str));
模型->设置项(第2行,新QS标准项(“600”);
模型->设置项(第3行,新QS标准项(“5”);
模型->设置项(第4行,新QS标准项(“60”));
模型->设置项(第5行,新QS标准项(“100”));
模型->设置项(第6行,新QS标准项(“100”);
模型->设置项(第7行,新QS标准项(“NA”);
行++;
}
冻结表小部件*tableView=新的冻结表小部件(模型);
tableView->setWindowTitle(QObject::tr(“冻结列示例”);
tableView->resize(900200);
tableView->show();
返回app.exec();
}
现在,如果我单击任何单元格,我会尝试显示
QMessageBox
,但它不起作用。请帮助我解决此问题。覆盖QTableView::currentChanged()
。然后,行号可通过row()
fr使用
frozenTableView->show();
frozenTableView->hide();
// FreezeTableWidget.cpp
#include <QtGui>
#include "freezetablewidget.h"
FreezeTableWidget::FreezeTableWidget(QAbstractItemModel * model)
{
setModel(model);
init();
connect(horizontalHeader(),SIGNAL(sectionResized ( int ,int,int )), this,
SLOT(updateSectionWidth(int, int, int)));
}
FreezeTableWidget::~FreezeTableWidget()
{
}
void FreezeTableWidget::init()
{
this->hideColumn(0);
this->setModel(model());
this->setFocusPolicy(Qt::NoFocus);
this->verticalHeader()->hide();
this->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
this->setSelectionBehavior(QAbstractItemView::SelectRows);
this->setEditTriggers(QAbstractItemView::NoEditTriggers);
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
}