自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于Subclassing QTableWidget中QTableWidget繼承

移動開發(fā)
QTableWidget是一個表示二維離散數(shù)組的表格。它在給定維度里顯示當前用戶滾動的單元格。當用戶在一個空的單元格中輸入一些文本時,QTableWidget自動創(chuàng)建一個QTableWidgetItem對象保存輸入的文本。

對于Qt 類前面已經(jīng)介紹的很詳細了,在本篇文章中就不多介紹了。那么本文講述的內(nèi)容是關(guān)于Subclassing QTableWidgetQTableWidget繼承。QTableWidget是一個表示二維離散數(shù)組的表格。它在給定維度里顯示當前用戶滾動的單元格。當用戶在一個空的單元格中輸入一些文本時,QTableWidget自動創(chuàng)建一個QTableWidgetItem對象保存輸入的文本。

現(xiàn)在我們來實現(xiàn)這個類,首先是頭文件spreadsheet.h,首先前向聲明兩個類Cell和SpreadsheetCompare。

  1. #ifndef SPREADSHEET_H  
  2. #define SPREADSHEET_H  
  3. #include <QTableWidget> 
  4. class Cell;  
  5. class SpreadsheetCompare;  
  6. class Spreadsheet : public QTableWidget{     
  7.    Q_OBJECTpublic:      
  8.       Spreadsheet(QWidget *parent = 0);      
  9.       bool autoRecalculate() const { return autoRecalc; }//內(nèi)聯(lián)函數(shù)      
  10.       QString currentLocation() const;      
  11.       QString currentFormula() const;      
  12.       QTableWidgetSelectionRange selectedRange() const;      
  13. void clear();      
  14.       bool readFile(const QString &fileName);      
  15.       bool writeFile(const QString &fileName);     
  16.       void sort(const SpreadsheetCompare &compare);  
  17. public slots:     
  18.     void cut();      
  19.     void copy();      
  20.     void paste();      
  21.     void del();      
  22.     void selectCurrentRow();      
  23.     void selectCurrentColumn();      
  24.     void recalculate();      
  25.     void setAutoRecalculate(bool recalc);      
  26.     void findNext(const QString &str, Qt::CaseSensitivity cs);      
  27.     void findPrevious(const QString &str, Qt::CaseSensitivity cs);signals:      
  28.     void modified();private slots:     
  29.     void somethingChanged();  
  30. private:      
  31.     enum { MagicNumber = 0x7F51C883RowCount = 999ColumnCount = 26 };      
  32.     Cell *cell(int row, int column) const;      
  33.     QString text(int row, int column) const;      
  34.     QString formula(int row, int column) const;      
  35.     void setFormula(int row, int column, const QString &formula);      
  36.     bool autoRecalc;};class SpreadsheetCompare{public:      
  37.     bool operator()(const QStringList &row1,                      
  38.     const QStringList &row2) const;     
  39.    enum { KeyCount = 3 };      
  40.      int keys[KeyCount];      
  41.       bool ascending[KeyCount];  
  42. };  
  43. #endif 

文本,對齊等這個QTableWidget單元格的屬性存儲在QTableWidgetItem類里。QTableWidgetItem類不是一個控件類,而是一個單純保存數(shù)據(jù)的類。

實現(xiàn)MainWindow類的時候我們用到了Spreadsheet的一些公有函數(shù)。如在MainWindow::newFile中調(diào)用clear()將表格置空。我們也用到了QTableWidget繼承來的一些函數(shù),如setCurrentCell()和setShowGrid()就多次調(diào)用過。

 #p#

Spreadsheet提供了很多槽函數(shù)來相應(yīng)Edit,Tools和Options等菜單的動作。信號modified()在表格發(fā)生變化時給出通知。私有槽函數(shù)somethingChanged()在Speadsheet類內(nèi)部使用。

在類的私有部分,我們聲明了三個常數(shù),四個函數(shù)和一個變量。在頭文件的最后定義了類SpreadsheetCompare

現(xiàn)在我們看一下源文件 spreadsheet.cpp:

  1. #include <QtGui> 
  2. #include "cell.h"  
  3. #include "spreadsheet.h"  
  4. Spreadsheet::Spreadsheet(QWidget *parent)  
  5.     : QTableWidget(parent)  
  6. {  
  7.     autoRecalc = true;  
  8.     setItemPrototype(new Cell);  
  9.     setSelectionMode(ContiguousSelection);  
  10.     connect(this, SIGNAL(itemChanged(QTableWidgetItem *)),  
  11.             this, SLOT(somethingChanged()));  
  12.     clear();  
  13. }  
  14. void Spreadsheet::clear()  
  15. {  
  16.     setRowCount(0);  
  17.     setColumnCount(0);  
  18.     setRowCount(RowCount);  
  19.     setColumnCount(ColumnCount);  
  20.     for (int i = 0; i < ColumnCount; ++i) {  
  21.         QTableWidgetItem *item = new QTableWidgetItem;  
  22.         item->setText(QString(QChar('A' + i)));  
  23.         setHorizontalHeaderItem(i, item);  
  24.     }  
  25.     setCurrentCell(0, 0);  
  26. }  
  27. Cell *Spreadsheet::cell(int row, int column) const  
  28. {  
  29.     return static_cast<Cell *>(item(row, column));  
  30. }  
  31. QString Spreadsheet::text(int row, int column) const  
  32. {  
  33.     Cell *c = cell(row, column);  
  34.     if (c) {  
  35.         return c->text();  
  36.     } else {  
  37.         return "";  
  38.     }  
  39. }  
  40. QString Spreadsheet::formula(int row, int column) const  
  41. {  
  42.     Cell *c = cell(row, column);  
  43.     if (c) {  
  44.         return c->formula();  
  45.     } else {  
  46.         return "";  
  47.     }  
  48. }  
  49. void Spreadsheet::setFormula(int row, int column,  
  50.                              const QString &formula)  
  51. {  
  52.     Cell *c = cell(row, column);  
  53.     if (!c) {  
  54.         c = new Cell;  
  55.         setItem(row, column, c);  
  56.     }  
  57.     c->setFormula(formula);  
  58. }  
  59. QString Spreadsheet::currentLocation() const  
  60. {  
  61.     return QChar('A' + currentColumn())  
  62.            + QString::number(currentRow() + 1);  
  63. }  
  64. QString Spreadsheet::currentFormula() const  
  65. {  
  66.     return formula(currentRow(), currentColumn());  
  67. }  
  68. void Spreadsheet::somethingChanged()  
  69. {  
  70.     if (autoRecalc)  
  71.         recalculate();  
  72.     emit modified();  

通常,用戶在一個空的單元格中輸入文本時,QTableWidget將會自動創(chuàng)建 QTableWidgetItem對象來保存這些文本。然而在 spreadsheet程序中,我們通過創(chuàng)建Cell 代替QTableWidgetItem。在構(gòu)造函數(shù)中,通過調(diào)用setItemProtoType()來實現(xiàn)。實際上是每次當需要創(chuàng)建一個新的項目時,QTableWidget 拷貝傳遞給setItemProtoType() 函數(shù)中的項目。

#p#

在構(gòu)造函數(shù)中,我們設(shè)置選擇方式QAbstractItemView::ContiguousSelection允許單一的矩形選擇。連接表格控件的信號itemChanged()和私有的somethingChanged()槽函數(shù),這樣當用戶編輯了一個單元格時,somethingChanged()能夠被調(diào)用。最后,我們調(diào)用clear()清空表格,設(shè)置列標頭。

在構(gòu)造函數(shù)中調(diào)用 clear()用來初始化表格。在MainWindow::newFile() 中也調(diào)用了這個函數(shù)。本來可以使用函數(shù)QTableWidget::clear()清除所有項和選擇,但這樣不能改變當前大小的標題頭。因此我們首先把表格重新定義為 0×0,這樣全部清除了表格和標題頭。然后把表格重新定義為ColumnCount×RowCount(26× 999),讓水平標題頭為QTableWidgetItem 類型,文本為"A"到"Z "。垂直標題欄會自動設(shè)置為1,2,到999。最后把光標移動到 A1。

QTableWidget由幾個子控件組成。它在最上面有一個水平的QHeaderView,最左邊有一個垂直的QHeaderView和兩個QScrollBars。中間區(qū)域是一個特殊的viewport控件,這個控件可以顯示網(wǎng)格。這些子控件可以通過QTableView和QAbstractScrollArea的函數(shù)進行操作。QAbstractScrollArea提供了一個可以滾動的viewport和兩個滾動條。它的子類是 QScrollArea。

關(guān)于Subclassing QTableWidget中QTableWidget繼承

在 Items中保存數(shù)據(jù):

在 Spreadsheet應(yīng)用程序中,每一個非空的單元格都作為一個獨立的 QTableWidgetItem對象被存放在內(nèi)存中。這種在 Item中保存數(shù)據(jù)的方法被QListWidget 和QTreeWidget所采用,對應(yīng)這兩個控件的Item類分別為QListWidgetItem和QTreeWidgetItem。

Qt的Item類還可以作為數(shù)據(jù)存儲器使用。比如,QTableWidgetItem也保存了一些屬性如文本,字體,顏色,圖標等,還有一個指向QTableWidget的指針。這個Item還可以保存QVariant類型的數(shù)據(jù),包括注冊的自定義類型。從這個類派生子類,我們還可以提供其他功能。

其他的工具是在它們的 item類中提供一個空指針來保存用戶數(shù)據(jù)。在 Qt中更加好用的方法是使用setData() ,把QVariant類型的數(shù)據(jù)保存起來。如果需要一個空類型指針,也可以從item類派生,在派生類中添加一個空類型指針成員變量。

對于那些更為復(fù)雜的數(shù)據(jù)處理,如大量的數(shù)據(jù),復(fù)雜的數(shù)據(jù)項,數(shù)據(jù)庫數(shù)據(jù)和多種數(shù)據(jù)顯示方式,Qt提供了一套model/view類將數(shù)據(jù)和顯示分離出來,第十章介紹了這個特性。

私有函數(shù) cell()返回指定的行數(shù)和列數(shù)的Cell對象。它和QTableWidget::item()是一樣的,只是它返回的是Cell類型的指針,QTableWidget::item()返回的是QTableWidgetItem類型的指針。
私有函數(shù) text()返回指定的單元格的文本。如果cell() 返回空指針,該單元格為空,則返回空字符。

函數(shù) formula()返回的是單元格的公式。大多數(shù)情況下,單元格的公式和文本是一樣的。例如,公式" hello"和字符"hello"是一樣的,如果用戶輸入了"hello",網(wǎng)格的文本就顯示為hello。但是下面會是例外:

1、如果公式是一個數(shù)字,那么單元格的文本也是數(shù)字。

2、如果公式是單引號開頭,公式的其他部分就是文本。如公式'12345,等價于串就是"12345" 。

3、如果公式由等號"="開頭,代表一個數(shù)學公式。如果A1為12, A2為6,那么公式"=A1+A2 "就是18。

把公式轉(zhuǎn)換為值的任務(wù)是由類 Cell完成的。此時需要記住的是單元格中顯示的文本是經(jīng)過公式計算的結(jié)果,而不是公式本身。

私有函數(shù) setFormula()用來給一個指定的單元格設(shè)置公式。如果該單元格有 Cell對象,那就使用這個對象。否則,我們創(chuàng)建一個新的 Cell對象,然后我們調(diào)用QTableWidget::setItem() 函數(shù)把它插入到表格中,最后調(diào)用單元格自己的setFormula()函數(shù),在單元格上顯示公式結(jié)果。我們不用刪除Cell對象,在適當?shù)臅r候,QTableWidget會自動刪除這些對象。

函數(shù) currentLocation()返回當前單元格的位置,字母顯示的列和行號,被 MainWindow::updateStatusBar()調(diào)用在狀態(tài)條上顯示位置。

函數(shù) currentFormula()返回當前單元格的公式。 MainWindow::updateStatusBar()調(diào)用了這個函數(shù)。

私有槽函數(shù) somethingChanged()中,如果 auto-recalculate為真,那么重新計算整個表格。然后發(fā)送 modified()信號。

小結(jié):想了解Qt更多的類,請到網(wǎng)上搜集就可以。關(guān)于Subclassing QTableWidget中從QTableWidget繼承的內(nèi)容介紹完了。希望本文對你有幫助!

【編輯推薦】

新手須知 QT類大全

在 Qt學習 QTableItem 類

PyQt學習筆記之QTableWidget

QT中建立Python GUI應(yīng)用程序

利用Qt繪圖實現(xiàn)QWT繪制科學圖表

責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-30 16:38:07

Qt QTableWidg

2011-06-15 11:09:48

Qt PyQt

2011-06-30 14:34:17

QT Tablewidge QTableWidg

2009-08-27 16:30:10

interface繼承

2009-06-18 09:51:25

Java繼承

2011-06-16 11:01:56

PHP繼承

2023-05-09 12:42:51

Java繼承多態(tài)

2011-07-15 15:47:02

JAVA

2017-02-06 13:31:19

Android樣式繼承關(guān)系

2022-12-14 09:10:06

JAVA注解繼承

2009-10-23 13:40:09

VB.NET基類

2009-07-14 17:36:28

Jython的繼承

2011-07-14 11:08:30

C#繼承

2011-07-08 10:25:55

JavaScript

2013-08-13 13:31:34

AndroidAsyncTaskcancel

2020-03-02 00:32:08

Python列表for循環(huán)

2009-07-02 13:25:00

消除實現(xiàn)繼承面向接口編程Java

2010-06-18 15:15:13

UML

2011-08-24 13:56:27

JavaScript

2012-05-14 10:18:54

jQuery
點贊
收藏

51CTO技術(shù)棧公眾號