Как получить выбранный номер строки из QTableView?

Я новичок в QT. я использую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 &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 <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 &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 <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();
}

Теперь, если я нажимаю на любую ячейку, я пытаюсь отобразитьQMessageBox, но это не работает. Пожалуйста, помогите мне решить проблему.

Ответы на вопрос(2)

Основная проблема в том, что вы создаетедва таблицы, когда вы создаете FreezeTableWidget, оба из которых находятся в одном и том же месте, один поверх другого. То есть у вас есть QTableView (frozenTableView), помещенный поверх FreezeTableWidget (это).

Это означает, что изменения выбора происходят в frozenTableView, который является QTableView, и, таким образом, ваш производный FreezeTableWidget не будет получать никаких вызовов методов.

Если вы хотите увидеть это, в :: init () замените строку:

frozenTableView->show();

с

frozenTableView->hide();

Я не вижу причины, по которой вам нужны две таблицы друг на друге. Если это было не то, что вы пытались сделать, и вам нужно только одно табличное представление (которое я рекомендую, если у вас нет причин, по которым вам нужны две одинаковые таблицы друг над другом), вы можете удалить переменную-член frozenTableView. Затем вы можете заменить большую часть кода, который ссылается на frozenTableView (например, большую часть кода в :: init, который устанавливает желаемое поведение), наэтот.

Я включил пример кода ниже:

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

QTableView::currentChanged(), Номер строки затем доступен сrow() отQModelIndex объект переданcurrentChanged().

Вы также можете переопределитьselectionChanged(), Оттуда вы можете получитьQList изQModelIndex объекты черезQItemSelection::indexes().

 Donotalo06 окт. 2010 г., 20:20
@saravanan: не могли бы вы опубликовать то, что вы пытались? людям обычно не хватает времени копаться в чужом проекте.
 saravanan06 окт. 2010 г., 11:33
Пожалуйста, скопируйте и вставьте ссылку в браузер
 saravanan07 окт. 2010 г., 06:24
я разместил здесь. пожалуйста, проверь это.stackoverflow.com/questions/3878643/...
 laalto06 окт. 2010 г., 10:37
@saravanan: эта ссылка просто перенаправляет на главную страницу fileden.com.
 saravanan06 окт. 2010 г., 10:22
Я пытался, но я не получил вывод. можете увидеть увидеть мой код и дать предложение. здесь я приложил исходный проект.
 saravanan06 окт. 2010 г., 11:21
пожалуйста, используйте эту новую ссылку:saravanan1986.p4o.net/test4tab.zip

Ваш ответ на вопрос