(1)先用一個簡單的例子,學習一下本類里的成員函數的使用。生成如下圖的界面,表格窗體與初始數據:
++查看其 ui_widget . h 文件 ,里面的將是最標準的表格窗體的使用代碼 :
#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QVBoxLayout * verticalLayout;//主窗體上一個按鈕,一個表格窗體。QPushButton * pushButton ;QTableWidget * tableWidget;void setupUi(QWidget * Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(136, 120);QFont font;font.setPointSize(14);Widget->setFont(font); //這一段是設置主窗體,并給予垂直布局Widget->setContextMenuPolicy(Qt::CustomContextMenu);verticalLayout = new QVBoxLayout(Widget);verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));pushButton = new QPushButton(Widget); //生成按鈕組件pushButton->setObjectName(QString::fromUtf8("pushButton"));verticalLayout->addWidget(pushButton);tableWidget = new QTableWidget(Widget); //生成表格窗體if (tableWidget->columnCount() < 3) //至少三列么?tableWidget->setColumnCount(3);//為表格窗體里的組件起名,起的名字怪怪的,避免重復,倆下劃線已經很奇特安全了。QTableWidgetItem * __qtablewidgetitem = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(1, __qtablewidgetitem1);QTableWidgetItem *__qtablewidgetitem2 = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(2, __qtablewidgetitem2); //生成水平表頭if (tableWidget->rowCount() < 2) //生成兩行tableWidget->setRowCount(2);QTableWidgetItem *__qtablewidgetitem3 = new QTableWidgetItem();tableWidget->setVerticalHeaderItem(0, __qtablewidgetitem3); QTableWidgetItem *__qtablewidgetitem4 = new QTableWidgetItem();tableWidget->setVerticalHeaderItem(1, __qtablewidgetitem4); //生成垂直表頭QTableWidgetItem *__qtablewidgetitem5 = new QTableWidgetItem();tableWidget->setItem(0, 0, __qtablewidgetitem5); //依次生成表里的每個元素[0,0]QTableWidgetItem *__qtablewidgetitem6 = new QTableWidgetItem();tableWidget->setItem(0, 1, __qtablewidgetitem6); //[0,1]QTableWidgetItem *__qtablewidgetitem7 = new QTableWidgetItem();tableWidget->setItem(0, 2, __qtablewidgetitem7); //[0,2]QTableWidgetItem *__qtablewidgetitem8 = new QTableWidgetItem();tableWidget->setItem(1, 0, __qtablewidgetitem8); //[1,0]QTableWidgetItem *__qtablewidgetitem9 = new QTableWidgetItem();tableWidget->setItem(1, 1, __qtablewidgetitem9); //[1,1]QTableWidgetItem *__qtablewidgetitem10 = new QTableWidgetItem();tableWidget->setItem(1, 2, __qtablewidgetitem10); //[1,2]tableWidget->setObjectName(QString::fromUtf8("tableWidget"));tableWidget->horizontalHeader()->setVisible(true);//使水平表頭可見。tableWidget->horizontalHeader()->setDefaultSectionSize(31);verticalLayout->addWidget(tableWidget); //把表格窗體加入到主窗體地的布局中。retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);//允許通過函數名綁定信號與槽函數。} // setupUivoid retranslateUi(QWidget * Widget){ //設置程序的標題Widget->setWindowTitle(QCoreApplication::translate("Widget", "H", nullptr));pushButton->setText(QCoreApplication::translate("Widget", "pushButton", nullptr));//以下依次賦予行表頭與列表頭要顯示的文本: cA cB cC rA rBQTableWidgetItem *___qtablewidgetitem = tableWidget->horizontalHeaderItem(0);___qtablewidgetitem->setText(QCoreApplication::translate("Widget", "cA", nullptr));QTableWidgetItem *___qtablewidgetitem1 = tableWidget->horizontalHeaderItem(1);___qtablewidgetitem1->setText(QCoreApplication::translate("Widget", "cB", nullptr));QTableWidgetItem *___qtablewidgetitem2 = tableWidget->horizontalHeaderItem(2);___qtablewidgetitem2->setText(QCoreApplication::translate("Widget", "cC", nullptr));QTableWidgetItem *___qtablewidgetitem3 = tableWidget->verticalHeaderItem(0);___qtablewidgetitem3->setText(QCoreApplication::translate("Widget", "rA", nullptr));QTableWidgetItem *___qtablewidgetitem4 = tableWidget->verticalHeaderItem(1);___qtablewidgetitem4->setText(QCoreApplication::translate("Widget", "rB", nullptr));const bool __sortingEnabled = tableWidget->isSortingEnabled();tableWidget->setSortingEnabled(false); //給表格中條目賦值時候不允許排序QTableWidgetItem *___qtablewidgetitem5 = tableWidget->item(0, 0);___qtablewidgetitem5->setText(QCoreApplication::translate("Widget", "0", nullptr));QTableWidgetItem *___qtablewidgetitem6 = tableWidget->item(0, 1);___qtablewidgetitem6->setText(QCoreApplication::translate("Widget", "1", nullptr));QTableWidgetItem *___qtablewidgetitem7 = tableWidget->item(0, 2);___qtablewidgetitem7->setText(QCoreApplication::translate("Widget", "2", nullptr));QTableWidgetItem *___qtablewidgetitem8 = tableWidget->item(1, 0);___qtablewidgetitem8->setText(QCoreApplication::translate("Widget", "3", nullptr));QTableWidgetItem *___qtablewidgetitem9 = tableWidget->item(1, 1);___qtablewidgetitem9->setText(QCoreApplication::translate("Widget", "4", nullptr));QTableWidgetItem *___qtablewidgetitem10 = tableWidget->item(1, 2);___qtablewidgetitem10->setText(QCoreApplication::translate("Widget", "5", nullptr));tableWidget->setSortingEnabled(__sortingEnabled);//最后恢復表格中的排序設置。} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H
(2)以下是 表格里的條目 QTableWidgetItem 類型的源代碼,定義于頭文件 qtablewidget . h 。無論是什么樣的模型與視圖里的條目,都是為了存儲數據,定義上都大同小異,故不再詳細注釋了 :
/*
The QTableWidgetItem class provides an item for use with the QTableWidget class.Detailed Description :
表格項用于存儲表格小部件的信息。項目通常包含文本、圖標或復選框。
QTableWidgetltem類是一個方便的類,它在Qt 3中替換了QTableWidgetltem類。
它提供了一個可以與QTableWidgetltem類一起使用的項目。
頂級項目在沒有父項的情況下構建,然后根據行號和列號指定的位置插入:QTableWidgetItem * newItem = new QTableWidgetItem(tr("%1").arg(pow(row, column+1)));tableWidget->setItem(row, column, newItem);每個項目都可以有自己的背景畫筆,這通過`setBackground()、函數來設置。
當前的背景畫筆可以通過background ()、函數來獲取。
每個項目的文本標簽可以使用其特定的字體和畫筆來呈現,這通過`setFont ()'和setForeground)函數進行指定,
并通過`font()`和`foreground()'函數來讀取。默認情況下,項是啟用的,可編輯的,可選擇的,可檢查的,并且既可以作為拖放操作的源,也可以作為落點目標。
每個項的標記可以通過調用setFlags()函數并傳入相應的值(見Qt:ItemFlags)來更改。
可檢查的項可以通過setCheckState()函數進行檢查和取消檢查。
對應的checkState()函數則指示該項當前是否被檢查過。Subclassing :
當子類化 QTableWidgetltem 以提供自定義項時,可以為它們定義新類型,以便它們可以與標準項區分開來.
需要此功能的子類的構造函數需要使用等于或大于 UserType 的新類型值調用基類構造函數。*/#ifndef QT_NO_DATASTREAM //說明本條目可以讀寫入數據流里進行調試。
Q_WIDGETS_EXPORT QDataStream & operator>>(QDataStream & in , QTableWidgetItem & item);
Q_WIDGETS_EXPORT QDataStream & operator<<(QDataStream & out, const QTableWidgetItem & item);
#endifclass Q_WIDGETS_EXPORT QTableWidgetItem
{friend class QTableWidget;friend class QTableModel;
private:QTableModel * tableModel() const;private: //可見,表格里的條目還有豐富的數據成員,以描述條目里的數據與屬性int rtti ;QList<QWidgetItemData> values ; //包含了條目里的數據QTableWidget * view ; //本條目屬于哪個表格窗體。QTableWidgetItemPrivate * d ;Qt::ItemFlags itemFlags; //本條目的編輯屬性。public:enum ItemType { Type = 0, UserType = 1000 };//Constructs a table item of the specified type that does not belong to any table.//形參 type會賦值給本類的私有數據成員 rtti,以保存本條目的類型。explicit QTableWidgetItem(int type = Type); //默認類型是 0inline int type() const { return rtti; }//Returns the type passed to the QTableWidgetItem constructor.//Constructs a table item with the given text.explicit QTableWidgetItem(const QString & text, int type = Type); //有參構造函數explicit QTableWidgetItem(const QIcon & icon,const QString & text, int type = Type);QTableWidgetItem(const QTableWidgetItem & other); //copy構造函數QTableWidgetItem & operator=(const QTableWidgetItem & other);//copy賦值運算符函數virtual ~QTableWidgetItem(); //析構函數virtual bool operator< (const QTableWidgetItem & other) const; //無注釋virtual QTableWidgetItem * clone() const; //Creates a copy of the item.//Returns the table widget that contains the item.inline QTableWidget * tableWidget() const { return view; }inline int row () const;inline int column() const;//Returns the row of the item in the table.//If the item is not in a table, this function will return -1.virtual void read (QDataStream & in ) ; //Reads the item from stream in .virtual void write(QDataStream & out) const; //Writes the item to stream out.//Returns true if the item is selected, otherwise returns false.bool isSelected() const;void setSelected(bool select); //Sets the selected state of the item to select./*enum Qt::ItemFlag {NoItemFlags = 0,ItemIsSelectable = 1,ItemIsEditable = 2,ItemIsDragEnabled = 4,ItemIsDropEnabled = 8,ItemIsUserCheckable = 16,ItemIsEnabled = 32,ItemIsAutoTristate = 64,ItemNeverHasChildren = 128,ItemIsUserTristate = 256};Q_DECLARE_FLAGS(ItemFlags, ItemFlag)Q_DECLARE_OPERATORS_FOR_FLAGS(ItemFlags)*/inlineQt::ItemFlags flags() const { return itemFlags; } //返回條目具有的屬性void setFlags(Qt::ItemFlags flags);virtual QVariant data(int role) const; //讀寫條目里具有的數據。virtual void setData(int role, const QVariant &value);//以下依次是讀寫條目里各角色對應的數據。inline QString text() const //角色 0{ return data(Qt::DisplayRole).toString(); }inline void setText(const QString & text){ setData(Qt::DisplayRole, text); }inline QIcon icon() const //角色 1{ return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }inline void setIcon(const QIcon & icon){ setData(Qt::DecorationRole, icon); }inline QString toolTip() const //角色 3{ return data(Qt::ToolTipRole).toString(); }inline void setToolTip(const QString & toolTip){ setData(Qt::ToolTipRole, toolTip); }inline QString statusTip() const //角色 4{ return data(Qt::StatusTipRole).toString(); }inline void setStatusTip(const QString &statusTip){ setData(Qt::StatusTipRole, statusTip); }inline QString whatsThis() const //角色 5{ return data(Qt::WhatsThisRole).toString(); }inline void setWhatsThis(const QString & whatsThis){ setData(Qt::WhatsThisRole, whatsThis); }inline QFont font() const //角色 6{ return qvariant_cast<QFont>(data(Qt::FontRole)); }inline void setFont(const QFont & font){ setData(Qt::FontRole, font); }inline int textAlignment() const//角色 7{ return data(Qt::TextAlignmentRole).toInt(); }inline void setTextAlignment(int alignment){ setData(Qt::TextAlignmentRole, alignment); }inline QBrush background() const //角色 8{ return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }inline void setBackground(const QBrush & brush){ setData(Qt::BackgroundRole,brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }//QBrush(Qt::GlobalColor color, Qt::BrushStyle bs = Qt::SolidPattern);inline QBrush foreground() const //角色 9{ return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }inline void setForeground(const QBrush &brush){ setData(Qt::ForegroundRole,brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }inline //enum Qt::CheckState { Unchecked, PartiallyChecked, Checked };Qt::CheckState checkState() const //角色 10{ return static_cast<Qt::CheckState>(data(Qt::CheckStateRole).toInt()); }inlinevoid setCheckState(Qt::CheckState state){ setData(Qt::CheckStateRole, state); }inline QSize sizeHint() const //角色 13{ return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }inline void setSizeHint(const QSize & size){ setData(Qt::SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }}; //完結 class QTableWidgetItem
(3)
(4)
謝謝