QT6 源(147)模型视图架构里的表格窗体 QTableWidget 的范例代码举例,以及其条目 QTableWidgetItem 类型的源代码。

(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_NAMESPACE

class 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);//允许通过函数名绑定信号与槽函数。
    } // setupUi

    void retranslateUi(QWidget * Widget)
    {   //设置程序的标题
        Widget->setWindowTitle(QCoreApplication::translate("Widget", "H", nullptr));
        pushButton->setText(QCoreApplication::translate(
            "Widget", "pushButton", nullptr));
        
        //以下依次赋予行表头与列表头要显示的文本: cA cB cC rA rB
        QTableWidgetItem *___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 Ui

QT_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);
#endif

class 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); //默认类型是 0

    inline 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)
    */
    inline
    Qt::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()); }
    inline
    void              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)

谢谢

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值