2010-10-07 569 views
2

我是QT新手。我使用的是從QTableView派生的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提示,但它不工作。請幫我解決這個問題。

回答

0

重寫QTableView::currentChanged()。行號隨後可從QModelIndex對象的row()中獲得,傳遞給currentChanged()。您可能還想覆蓋selectionChanged()。從那裏你可以通過QItemSelection::indexes()得到QListQModelIndex對象。

+0

我試過,但我我以前不得到的輸出。可以看到我的代碼並給出建議。在這裏我附上了源項目。 – saravanan 2010-10-06 08:22:31

+0

@saravanan:該鏈接只是重定向到fileden.com的首頁。 – laalto 2010-10-06 08:37:25

+0

請使用這個新的鏈接: http://saravanan1986.p4o.net/test4tab.zip – saravanan 2010-10-06 09:21:26

3

我不完全確定你想要用FreezeTableWidget做什麼。

基本問題是,當您創建FreezeTableWidget時,您正在創建兩個表,這兩個表位於同一個空間,一個在另一個之上。這是你有一個放置在FreezeTableWidget(this)之上的QTableView(frozenTableView)。

這意味着選擇更改發生在frozenTableView中,這是一個QTableView,因此您的派生FreezeTableWidget不會從中獲取任何方法調用。

如果你想看到這一點,在::的init()替換行:

frozenTableView->hide(); 

frozenTableView->show(); 

我看不出一個原因,你需要在上面兩個表彼此的。如果這不是你想要做的,並且你只想要一個表視圖(我建議,除非你有理由需要兩個相同的表在另一個之上),你可以刪除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); 
} 
相關問題