优质的做网站,网站构成的作用,猪八戒网做网站如何,微信推广方案范文文章目录 1. QTableWidget概述2. 源码2.1 可视化UI设计2.2 程序框架2.3 qwintspindelegate.h2.4 qwintspindelegate.cpp2.5 mainwindow.h2.6 mainwindow.cpp 1. QTableWidget概述
QTableWidget是Qt中的表格组件类。在窗体上放置一个QTableWidget 组件后,可以在 PropertyEditor… 文章目录 1. QTableWidget概述2. 源码2.1 可视化UI设计2.2 程序框架2.3 qwintspindelegate.h2.4 qwintspindelegate.cpp2.5 mainwindow.h2.6 mainwindow.cpp 1. QTableWidget概述
QTableWidget是Qt中的表格组件类。在窗体上放置一个QTableWidget 组件后,可以在 PropertyEditor 里对其进行属性设置双击这个组件可以打开一个编辑器对其 Colum、Row 和 Item 进行编辑。一个QTableWidget 组件的界面基本结构如图4-17 所示这个表格设置为6行5列。 表格的第1行称为行表头用于设置每一列的标题第1列称为列表头可以设置其标题但一般使用缺省的标题即为行号。行表头和列表头一般是不可编辑的。
除了行表头和列表头之外的表格区域是内容区内容区是规则的网格状如同一个二维数组每个网格单元称为一个单元格。每个单元格有一个行号、列号图4-17 表示了行号、列号的变化规律。
在QTableWidget 表格中每一个单元格是一个QTableWidgetItem 对象可以设置文字内容、字体、前景色、背景色、图标也可以设置编辑和显示标记。每个单元格还可以存储一个 QVariant 数据用于设置用户自定义数据。
实例 samp4_9以QTableWidget 为主要组件演示 QTableWidget 一些主要操作的实现。实例运行时的界面如图 4-18 所示该实例将演示以下功能的实现方法。 设置表格的列数和行数设置表头的文字、格式等。 初始化表格数据设置一批实例数据填充到表格里。 插入行、添加行、删除当前行的操作。 遍历表格所有单元格读取表格内容到一个 QPlainTextEdit 里表格的一行数据作为一行文本。 表格上选择的当前单元格变化时在状态栏显示单元格存储的信息 2. 源码
2.1 可视化UI设计 2.2 程序框架 2.3 qwintspindelegate.h
#ifndef QWINTSPINDELEGATE_H
#define QWINTSPINDELEGATE_H#include QObject
#include QWidget
#include QItemDelegateclass QWIntSpinDelegate : public QItemDelegate
{Q_OBJECT
public:QWIntSpinDelegate(QObject *parent0);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem option,const QModelIndex index) const Q_DECL_OVERRIDE;void setEditorData(QWidget *editor, const QModelIndex index) const Q_DECL_OVERRIDE;void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex index) const Q_DECL_OVERRIDE;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem option,const QModelIndex index) const Q_DECL_OVERRIDE;
};#endif // QWINTSPINDELEGATE_H
2.4 qwintspindelegate.cpp
#include qwintspindelegate.h#include QSpinBoxQWIntSpinDelegate::QWIntSpinDelegate(QObject *parent):QItemDelegate(parent)
{}QWidget *QWIntSpinDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem option, const QModelIndex index) const
{Q_UNUSED(option);Q_UNUSED(index);QSpinBox *editor new QSpinBox(parent);editor-setFrame(false);editor-setMinimum(0);editor-setMaximum(10000);return editor;
}void QWIntSpinDelegate::setEditorData(QWidget *editor,const QModelIndex index) const
{int value index.model()-data(index, Qt::EditRole).toInt();QSpinBox *spinBox static_castQSpinBox*(editor);spinBox-setValue(value);
}void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const
{QSpinBox *spinBox static_castQSpinBox*(editor);spinBox-interpretText();int value spinBox-value();model-setData(index, value, Qt::EditRole);
}void QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem option, const QModelIndex index) const
{Q_UNUSED(index);editor-setGeometry(option.rect);
}2.5 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QMainWindow
#include QLabel
#include QTableWidgetItem#include qwintspindelegate.hnamespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTprivate:
// 自定义单元格Type的类型在创建单元格的Item时使用enum CellType{ctName1000,ctSex,ctBirth,ctNation,ctPartyM,ctScore}; //各单元格的类型// 各字段在表格中的列号enum FieldColNum{colName0, colSex,colBirth,colNation,colScore,colPartyM};QLabel *labCellIndex; //状态栏上用于显示单元格的行号、列号QLabel *labCellType; //状态栏上用于显示单元格的typeQLabel *labStudID; //状态栏上用于显示单元格的data,QWIntSpinDelegate spinDelegate; //代理组件void createItemsARow(int rowNo,QString Name,QString Sex,QDate birth,QString Nation,bool isPM,int score); //为某一行创建items
public:explicit MainWindow(QWidget *parent 0);~MainWindow();private slots:void on_btnSetHeader_clicked(); //设置表头 按键void on_btnSetRows_clicked(); //设置行数 按键void on_btnIniData_clicked(); //初始化数据 按键void on_chkBoxTabEditable_clicked(bool checked); //表格可编辑 checkboxvoid on_chkBoxHeaderH_clicked(bool checked); //显示行表头 checkboxvoid on_chkBoxHeaderV_clicked(bool checked); //显示列表头 checkboxvoid on_chkBoxRowColor_clicked(bool checked); //间隔行底色 checkboxvoid on_rBtnSelectItem_clicked(); // 行选择模式 RadioButtonvoid on_rBtnSelectRow_clicked(); // 单元格选择模式 RadioButtonvoid on_btnReadToEdit_clicked(); //读取表格内容到文本 按键void on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);void on_btnInsertRow_clicked(); //插入行 按键void on_btnAppendRow_clicked(); //添加行 按键void on_btnDelCurRow_clicked(); //删除当前行 按键void on_btnAutoHeght_clicked();void on_btnAutoWidth_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
2.6 mainwindow.cpp
#include mainwindow.h
#include ui_mainwindow.h#include QDate
#include QTableWidgetItem
#include QComboBox
#include QTextBlock
#include QTextDocumentvoid MainWindow::createItemsARow(int rowNo,QString Name,QString Sex,QDate birth,QString Nation,bool isPM,int score)
{ //为一行的单元格创建 ItemsQTableWidgetItem *item;QString str;uint StudID201605000; //学号基数//姓名//新建一个Item设置单元格type为自定义的MainWindow::ctNameitemnew QTableWidgetItem(Name,MainWindow::ctName);item-setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式StudID rowNo; //学号基数 行号item-setData(Qt::UserRole,QVariant(StudID)); //设置studID为dataui-tableInfo-setItem(rowNo,MainWindow::colName,item); //为单元格设置Item//性别QIcon icon;if (Sex男)icon.addFile(:/images/icons/boy.ico);elseicon.addFile(:/images/icons/girl.ico);itemnew QTableWidgetItem(Sex,MainWindow::ctSex); //新建一个Item设置单元格type为自定义的 MainWindow::ctSexitem-setIcon(icon);item-setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//为单元格设置Itemui-tableInfo-setItem(rowNo,MainWindow::colSex,item);//为单元格设置Item//出生日期strbirth.toString(yyyy-MM-dd); //日期转换为字符串itemnew QTableWidgetItem(str,MainWindow::ctBirth);//新建一个Item设置单元格type为自定义的 MainWindow::ctBirthitem-setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); //文本对齐格式ui-tableInfo-setItem(rowNo,MainWindow::colBirth,item);//为单元格设置Item//民族itemnew QTableWidgetItem(Nation,MainWindow::ctNation); //新建一个Item设置单元格type为自定义的 MainWindow::ctNationitem-setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式ui-tableInfo-setItem(rowNo,MainWindow::colNation,item);//为单元格设置Item//是否党员itemnew QTableWidgetItem(党员,MainWindow::ctPartyM);//新建一个Item设置单元格type为自定义的 MainWindow::ctPartyMitem-setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式if (isPM)item-setCheckState(Qt::Checked);elseitem-setCheckState(Qt::Unchecked);item-setBackgroundColor(Qt::yellow);//Qt::green lightGray yellowui-tableInfo-setItem(rowNo,MainWindow::colPartyM,item);//为单元格设置Item//分数str.setNum(score);itemnew QTableWidgetItem(str,MainWindow::ctScore);//新建一个Item设置单元格type为自定义的 MainWindow::ctPartyMitem-setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式ui-tableInfo-setItem(rowNo,MainWindow::colScore,item);//为单元格设置Item
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui-setupUi(this);setCentralWidget(ui-splitterMain);//状态栏初始化创建labCellIndex new QLabel(当前单元格坐标,this);labCellIndex-setMinimumWidth(250);labCellTypenew QLabel(当前单元格类型,this);labCellType-setMinimumWidth(200);labStudIDnew QLabel(学生ID,this);labStudID-setMinimumWidth(200);ui-statusBar-addWidget(labCellIndex);//加到状态栏ui-statusBar-addWidget(labCellType);ui-statusBar-addWidget(labStudID);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnSetHeader_clicked()
{ //设置表头QTableWidgetItem *headerItem;QStringList headerText;headerText姓 名性 别出生日期民 族分数是否党员; //表头标题用QStringList来表示
// ui-tableInfo-setHorizontalHeaderLabels(headerText);ui-tableInfo-setColumnCount(headerText.count());//列数设置为与 headerText的行数相等for (int i0;iui-tableInfo-columnCount();i)//列编号从0开始{headerItemnew QTableWidgetItem(headerText.at(i)); //新建一个QTableWidgetItem headerText.at(i)获取headerText的i行字符串QFont fontheaderItem-font();//获取原有字体设置font.setBold(true);//设置为粗体font.setPointSize(12);//字体大小headerItem-setTextColor(Qt::red);//字体颜色headerItem-setFont(font);//设置字体ui-tableInfo-setHorizontalHeaderItem(i,headerItem); //设置表头单元格的Item}ui-tableInfo-setItemDelegateForColumn(colScore,spinDelegate);//设置自定义代理组件
}void MainWindow::on_btnSetRows_clicked()
{ //设置行数,设置的行数为数据区的行数不含表头//如设置10行数据区有10行但是访问行号为0~9ui-tableInfo-setRowCount(ui-spinRowCount-value());//设置数据区行数ui-tableInfo-setAlternatingRowColors(ui-chkBoxRowColor-isChecked()); //设置交替行背景颜色
}void MainWindow::on_btnIniData_clicked()
{ //初始化表格内容QString strName,strSex;bool isPartyfalse;QDate birth;birth.setDate(1980,4,7);//初始化一个日期ui-tableInfo-clearContents();//只清除工作区不清除表头int Rowsui-tableInfo-rowCount(); //数据区行数for (int i0;iRows;i) //数据区第1行的编号为0所以范围是0~rowCount()-1{strNameQString::asprintf(学生%d,i); //学生姓名if ((i % 2)0) //分奇数偶数行设置性别及其图标strSex男;elsestrSex女;createItemsARow(i, strName, strSex, birth,汉族,isParty,70); //为某一行创建itemsbirthbirth.addDays(20); //日期加20天isParty !isParty;}
}void MainWindow::on_chkBoxTabEditable_clicked(bool checked)
{ //设置编辑模式if (checked)
//双击或获取焦点后单击进入编辑状态ui-tableInfo-setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);elseui-tableInfo-setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
}void MainWindow::on_chkBoxHeaderH_clicked(bool checked)
{//是否显示水平表头ui-tableInfo-horizontalHeader()-setVisible(checked);
}void MainWindow::on_chkBoxHeaderV_clicked(bool checked)
{//是否显示垂直表头ui-tableInfo-verticalHeader()-setVisible(checked);
}void MainWindow::on_chkBoxRowColor_clicked(bool checked)
{ //行的底色交替采用不同颜色ui-tableInfo-setAlternatingRowColors(checked);
}void MainWindow::on_rBtnSelectItem_clicked()
{//选择行为单元格选择ui-tableInfo-setSelectionBehavior(QAbstractItemView::SelectItems);
}void MainWindow::on_rBtnSelectRow_clicked()
{//选择行为行选择ui-tableInfo-setSelectionBehavior(QAbstractItemView::SelectRows);
}void MainWindow::on_btnReadToEdit_clicked()
{//将 QTableWidget的所有行的内容提取字符串显示在QPlainTextEdit里QString str;QTableWidgetItem *cellItem;ui-textEdit-clear(); //文本编辑器清空for (int i0;iui-tableInfo-rowCount();i) //逐行处理{strQString::asprintf(第 %d 行 ,i1);for (int j0;jui-tableInfo-columnCount()-1;j) //逐列处理但最后一列是check型单独处理{cellItemui-tableInfo-item(i,j); //获取单元格的itemstrstrcellItem-text() ; //字符串连接}cellItemui-tableInfo-item(i,colPartyM); //最后一列党员if (cellItem-checkState()Qt::Checked) //根据check状态显示文字strstr党员;elsestrstr群众;ui-textEdit-appendPlainText(str); //添加到编辑框作为一行}
}void MainWindow::on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{//当前选择单元格发生变化时的响应Q_UNUSED(previousRow);Q_UNUSED(previousColumn);QTableWidgetItem* itemui-tableInfo-item(currentRow,currentColumn); //获取单元格的 Itemif (itemNULL)return;labCellIndex-setText(QString::asprintf(当前单元格坐标%d 行%d 列,currentRow,currentColumn));int cellTypeitem-type();//获取单元格的类型labCellType-setText(QString::asprintf(当前单元格类型%d,cellType));itemui-tableInfo-item(currentRow,MainWindow::colName); //取当前行第1列的单元格的 itemint IDitem-data(Qt::UserRole).toInt();//读取用户自定义数据labStudID-setText(QString::asprintf(学生ID%d,ID));//学生ID
}void MainWindow::on_btnInsertRow_clicked()
{ //插入一行int curRowui-tableInfo-currentRow();//当前行号ui-tableInfo-insertRow(curRow); //插入一行但不会自动为单元格创建itemcreateItemsARow(curRow, 新学生, 男,QDate::fromString(1990-1-1,yyyy-M-d),苗族,true,60 ); //为某一行创建items
}void MainWindow::on_btnAppendRow_clicked()
{ //添加一行int curRowui-tableInfo-rowCount();//当前行号ui-tableInfo-insertRow(curRow);//在表格尾部添加一行createItemsARow(curRow, 新生, 女,QDate::fromString(2000-1-1,yyyy-M-d),满族,false,50 ); //为某一行创建items
}void MainWindow::on_btnDelCurRow_clicked()
{//删除当前行及其itemsint curRowui-tableInfo-currentRow();//当前行号ui-tableInfo-removeRow(curRow); //删除当前行及其items
}void MainWindow::on_btnAutoHeght_clicked()
{ui-tableInfo-resizeRowsToContents();
}void MainWindow::on_btnAutoWidth_clicked()
{ui-tableInfo-resizeColumnsToContents();
}