黑马程序员---Qt QTableWidget summer

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一.QTableWidget Design Framework

1.QTableWidget->QTableView->QAbstractItemView->QAbstractScorllArea->QFrame->QWidget->QObject 

2.QWidget:

QMenuBar *menuBar; 

QToolBar *mainToolBar;

QWidget *centralWidget;

QStatusBar *statusBar;

3.对于只在头文件中声明类,没有实现(New出来的)只需在头文件中,在构造新的类的开头,Class声明一下即可

class QTableWidget ;
class QTableWidgetItem ;

4.派生类的继承:采用单继承的方式,对于图形界面的设计只能在Qt中的Ui可视化界面和自己纯手工代码编写的界面选取一个,不要相互参合。

class TableWidget : public QMainWindow

5.对于文件中的公有变量,在函数之间需要相互传递的,需进行声明变量,

QString openName ;
QT_NAMESPACE::QString getOpenName() const { return openName; }
void setOpenName(QT_NAMESPACE::QString val) { openName = val; }

6.在构造函数中,构造程序初始界面,如:菜单里,工具栏,主窗口,状态栏,

//初始化界面
void creatActions() ;
void creatMenus() ;
void creatToolBar();
void creatStatusBar();
void initalTableWidget();
void clearTableWidget() ;
virtual void contextMenuEvent ( QContextMenuEvent * event );

7.对各个功能键设置信号和槽机制,

//建立信号和槽机制
void connetSlot();

private slots:
void onTriggerded();
void updateLocation( QTableWidgetItem *item ,QTableWidgetItem*);

8.对中文字体的设置

QTextCodec ::setCodecForTr(QTextCodec ::codecForName("GBK"));   在主函数中设置 或者gb2312编码

 mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));   utf8国际化编码

objectName.setWindowTitle(QString :: fromStdWString(L"我的制表窗口"));

9.剪切,复制,粘贴,清除:

剪切就是在当前没有数据时,直接返回。如果当前有数据,先用容器记住数据,然后清除当前数据。(也就是先复制后清除的功能组合)

void TableWidget::actCutFunction()
{
actCopyFunction() ;
actDeleteFunction();
return ;
}

复制就是当容器内有数据时需要先清除,然后把当前的数据存储在容器里面,

void TableWidget::actCopyFunction()
{
QList<QTableWidgetSelectionRange>  itemsRange= tableWidget->selectedRanges();
if (itemsRange.size() == 0 )
{
return ;
}
//copyList.clear() ;
if (! copyList.isEmpty())
{
copyList.clear() ;
}
for (int i = itemsRange[0].topRow() ;i <=itemsRange[0].bottomRow() ;i++)
{
copyRow.clear() ;
for (int j = itemsRange[0].leftColumn() ;j<=itemsRange[0].rightColumn() ;j++)
{
copyRow <<tableWidget->item(i,j)->text() ;
}
copyList<<copyRow ;
}
copyRow.clear() ;
return ;
}

粘贴就是把存储起来的数据按照指定的存储方式在当前文件中显示出来,

void TableWidget::actPasteFunctinon()
{
if (copyList.isEmpty())
{
return ;
}
int r =  tableWidget->currentRow();
int c = tableWidget->currentColumn() ;
QTableWidgetItem*curItem ;
for (int  i =r ;i<r+copyList.size() ;i++)
{
for(int j = c ;j<c+copyList[0].size();j++)
{
tableWidget->item(i,j)->setText(copyList[i-r][j-c]);
}
}
}

清除就是把当前文件的内容都设置为空字符。

void TableWidget::actDeleteFunction()
{
QList<QTableWidgetItem*>items = tableWidget->selectedItems() ;
if (0==items.size())
{
return ;
}
foreach(QTableWidgetItem*i,items)
i->setText("") ;
}

10.新建,打开,保存,另存

新建就是先判断当前文件是否有数据,数据是否变动,然后出来信息处理窗口,询问是否需要进行保存

如果需要进行保存,直接调用保存操作即可,不需要保存,清除当前数据,

void TableWidget::newfunction()
{
if ( ! hasData() )
{
return ;
}
int n  = QMessageBox :: warning(this,tr("友情提醒:"),tr("当前文档有数据存在,是否需要先保存"),
QMessageBox::Yes|QMessageBox::No|QMessageBox::Discard);

if (QMessageBox :: Yes != n  )
//或者QMessageBox msg;  QMessageBox::Yes != msg.exec()
{
clearTableWidget() ;
return ;
}
actSaveFunction() ;
clearTableWidget() ;
return ;
}

打开就是先出现文件对话框,获取文件打开的路径,传递文件名,调用readfile函数,如果打开不成功,报错,返回。打开成功后,传递list数据,把数据写到文件中

void TableWidget::openFunction()
{
QString fileOpneName = QFileDialog :: getOpenFileName(this,tr("打开文件"),"");
openName = fileOpneName ;
QList<QList<QVariant>> list ;
ReadWriteFile rwf(this) ;
if (!rwf.readFile(fileOpneName,list))
{
//rwf.m_getError = QObject::tr("文件打开错误:%1").arg(fileName) ;
rwf.getFileError() ;
return ;
}


//tableWidget->setRowCount(list.size()) ;
//tableWidget->setColumnCount(list[0].size()) ;
//如果动态行列需要记住本次文件退出前的行列


for (int i= 0 ;i<tableWidget->rowCount();i++)
{
for (int j= 0 ;j<tableWidget->columnCount() ;j++)
{
tableWidget->setItem(i,j,new QTableWidgetItem(list[i][j].toString()));
//void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item )  
//因此需要new QTableWidgetItem(list[i][j].toString())
}
}
return ;
}

保存就是先要获得打开文件的文件名,在新建一个容器,容器调用dataconvent函数 ,获得数据,把文件名和容器传递给writefile函数进行写文件,

void TableWidget::actSaveFunction()
{
if (getOpenName().isEmpty())
{
actSaveAsFunction();
}
QString fileSaveName = getOpenName() ;
save(fileSaveName) ;
}

另存就是从新获得存储路径,在执行保存的功能。

void TableWidget::actSaveAsFunction()
{
QString fileSaveAsName = 
QFileDialog :: getSaveFileName( this,tr("获取文件路径"),".","fileTxt(*.txt);;fileSpead(*.spread)") ;
if (fileSaveAsName.isEmpty())
{
return ;
}
save(fileSaveAsName) ;
}

11.文件读写

文件写就是一般需要两个参数,文件名和数据,把文件名 关联QFile类,执行打开操作,如果打开失败,获取失败的消息,返回。否者打开成功。用QDataStream类写入数据,此时需要设置一个文件独有的magic code 作为私有文件打开时的验证码,然后读取文件信息,关闭文件,退出。

bool ReadWriteFile::WriteFile(const QString & fileName , QList<QList<QVariant>> &list)
{
QFile file(fileName) ;
if (!file.open(QFile ::WriteOnly))
{
m_getError = file.errorString() ;
return false ;
}
QDataStream cout(&file) ;
cout<<magic ;
cout<<list ;
file.close() ;
return true;
}

文件读就是文件写的反操作,同样当前文件名和已存储的数据,判断打开是否成功,打开失败返回失败消息,打开成功验证magic code 是否一致,读取magic code,在读取list 数据,关闭文件,退出。

bool ReadWriteFile::readFile(const QString & fileName , QList<QList<QVariant>>& list)
{
QFile file(fileName) ;
if (!file.open(QFile::ReadOnly))
{
m_getError = file.errorString() ;
return false ;
}
QDataStream cin(&file) ;
QString str ;
cin>>str ;
if (0!=str.compare(magic))
{
m_getError = QObject :: tr("%1读写错误").arg(fileName) ;
return false ;
}
list.clear() ;
cin>>list;
file.close() ;
return true ;
}

11.1文件菜单的其他数据信息

数据传递就是对给出一个数据的容器库,把当前文件中的数据,按照当前的文件格式写到数据容器中

void TableWidget::dataConvent(QList <QList<QVariant>>& list)
{
QList<QVariant> aRow ;
QString str ;
for (int i= 0 ;i<tableWidget->rowCount();i++)
{
aRow.clear() ;
for (int j= 0 ;j<tableWidget->columnCount() ;j++)
{
str = tableWidget->item(i,j)->text() ;
aRow.append(str) ;
}
list.push_back(aRow) ;
}
}

是否有数据,是对保存文件所作出的判断需要(如果没有数据就没有保存一说)(对于判读的函数只需要一个bool值即可)

bool TableWidget::hasData()
{
QString curText ;
for (int i= 0 ;i<tableWidget->rowCount();i++)
{
for (int j= 0 ;j<tableWidget->columnCount() ;j++)
{
curText = tableWidget->item(i,j)->text() ;
if (!curText.isEmpty())
{
return true ;
}
}
}
return false ;
}

清除当前文件信息,就是对当前文件进行初始化

void TableWidget::clearTableWidget()
{
initalTableWidget();
}

当前文件初始化

void TableWidget::initalTableWidget()
{
tableWidget = new QTableWidget ;
tableWidget->setRowCount(TableRow) ;
tableWidget->setColumnCount(TableColoum) ;
QList<QString>tableHeaderText ;
for (int i = 'A';i<='Z';i++)
{
tableHeaderText<<QString(QChar(i));
}
tableWidget->setHorizontalHeaderLabels(tableHeaderText);

for (int i= 0 ;i<tableWidget->rowCount();i++)
{
for (int j= 0 ;j<tableWidget->columnCount() ;j++)
{
QTableWidgetItem *item = new QTableWidgetItem ;
tableWidget->setItem(i,j, item) ;
/*item->setData(Qt::StatusTipRole,"wodekjkljljk") ;*/

}
}
setCentralWidget(tableWidget) ;
}

12.对于设置上下文菜单的操作

void QWidget::contextMenuEvent ( QContextMenuEvent * event ) [virtual protected]

void TableWidget::contextMenuEvent(QContextMenuEvent * event)
{
QPoint point = event->globalPos();
QMenu menu ;
menu.addActions(m_actions.mid(6,5)) ;
menu.exec(point) ;
}

QWindget 的虚函数,事件响应函数,当需要调用的时候系统自动调用此函数,(信号为中心窗口的鼠标右击)

时间获取为当前鼠标的右击点,在此刻响应画图










阅读更多
上一篇黑马程序员---笔记
下一篇黑马程序员---Qt QTableWidget 2
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭