成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于Subclassing QTableWidget中QTableWidget繼承

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

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

現在我們來實現這個類,首先是頭文件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; }//內聯函數      
  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類不是一個控件類,而是一個單純保存數據的類。

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

 #p#

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

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

現在我們看一下源文件 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將會自動創建 QTableWidgetItem對象來保存這些文本。然而在 spreadsheet程序中,我們通過創建Cell 代替QTableWidgetItem。在構造函數中,通過調用setItemProtoType()來實現。實際上是每次當需要創建一個新的項目時,QTableWidget 拷貝傳遞給setItemProtoType() 函數中的項目。

#p#

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

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

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

關于Subclassing QTableWidget中QTableWidget繼承

在 Items中保存數據:

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

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

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

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

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

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

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

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

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

把公式轉換為值的任務是由類 Cell完成的。此時需要記住的是單元格中顯示的文本是經過公式計算的結果,而不是公式本身。

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

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

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

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

小結:想了解Qt更多的類,請到網上搜集就可以。關于Subclassing QTableWidget中從QTableWidget繼承的內容介紹完了。希望本文對你有幫助!

【編輯推薦】

新手須知 QT類大全

在 Qt學習 QTableItem 類

PyQt學習筆記之QTableWidget

QT中建立Python GUI應用程序

利用Qt繪圖實現QWT繪制科學圖表

責任編輯:zhaolei 來源: 互聯網
相關推薦

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繼承

2011-06-16 11:01:56

PHP繼承

2009-06-18 09:51:25

Java繼承

2023-05-09 12:42:51

Java繼承多態

2009-10-23 13:40:09

VB.NET基類

2017-02-06 13:31:19

Android樣式繼承關系

2011-07-15 15:47:02

JAVA

2022-12-14 09:10:06

JAVA注解繼承

2009-07-14 17:36:28

Jython的繼承

2011-07-08 10:25:55

JavaScript

2011-07-14 11:08:30

C#繼承

2020-03-02 00:32:08

Python列表for循環

2013-08-13 13:31:34

AndroidAsyncTaskcancel

2017-08-03 15:54:50

Kotlin繼承

2012-05-14 10:18:54

jQuery

2011-08-24 13:56:27

JavaScript

2010-06-18 15:15:13

UML
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 视频一区二区中文字幕 | 国产福利在线看 | 国产亚洲一区二区三区在线观看 | 国际精品鲁一鲁一区二区小说 | 久在草 | 日韩精品成人一区二区三区视频 | 欧美日韩视频 | 中文字幕在线播放第一页 | 亚洲欧美中文日韩在线v日本 | 91精品久久久 | 在线成人免费视频 | 综合久久久久久久 | av在线播放一区二区 | 亚洲一区二区三区免费视频 | 国产免费一区二区 | 欧美炮房 | 精区3d动漫一品二品精区 | 不卡欧美| 在线播放中文字幕 | 亚洲人成人网 | 日韩亚洲欧美综合 | 夜夜草 | 国产午夜精品视频 | 亚洲精品在线免费观看视频 | 亚洲免费精品 | 精品国产亚洲一区二区三区大结局 | 中文字幕国产精品视频 | 欧美片网站免费 | 91看片免费版 | 国产日韩精品一区二区三区 | 黄网站涩免费蜜桃网站 | 中文字幕亚洲一区二区va在线 | 亚洲欧美在线视频 | 亚洲成人中文字幕 | 国产999精品久久久久久 | 在线看一区二区 | 99精品久久久久久中文字幕 | 国产欧美一区二区久久性色99 | 国产免费视频 | www国产成人免费观看视频,深夜成人网 | 91精品久久久久久久久中文字幕 |