在学习QT的时候,用ui做好表格的界面,最近学到用容器类操作tabwidget的方法。
放置tablewidget组件,编辑好每个界面的命名,如tablewidget_realState、tablewidget_devAddr等。
创建容器类,需要操作的时候,利用迭代器遍历进行操作。
具体代码如下:
.h文件
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
//初始化出场设置的TableWidget
void IniTableWidget_Factory();
//对于下拉列表框的操作,初始化列表和添加列表项
void IniComboBox();
//初始化指示器挂装界面
void IniIndicatorMount();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void saveRealStateParam();
void saveDebugAddrParam();
void saveMeterParam();
void saveBattaryParam();
void saveEleFieldParam();
void saveGroundCurParam();
void saveShortCurParam();
void saveNodeInfoParam();
private slots:
void on_btnOpenParameter_clicked();
void on_btnStopParameter_clicked();
void on_btnOpenFrequency_clicked();
void on_btnStopFrequency_clicked();
void on_actSystemSetting_triggered();
//设备配置右键菜单的创建
void treeMenuFun(QTreeWidgetItem *item,int column);
//增加采集设备
void showAddCaijiDevice();
//修改设备地址
void changeAddr();
//删除采集设备
void showRemoveDevice();
private:
Ui::MainWindow *ui;
InputAddr *addrDialog;
ModifyAddr *modifyDialog;
QMenu *treeMenu;
QMap<int,QTableWidget*>tables;
QStringList headItems;
QVector<int> vecStd;
};
typedef void (MainWindow::*PFUNC)();
extern QMap<int,PFUNC> caijiFuncPtrs;
#endif // MAINWINDOW_H
.c文件
void MainWindow::IniIndicatorMount()
{
//指示器挂装界面的初始化
//treeWidget中项目,创建右键菜单
addrDialog = new InputAddr(this);
modifyDialog = new ModifyAddr(this);
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidgetDevice,
QStringList(QString::fromLocal8Bit("采集设备")),0);
connect(ui->treeWidgetDevice,SIGNAL(itemPressed(QTreeWidgetItem *,int)),
this,SLOT(treeMenuFun(QTreeWidgetItem *,int)));
//tables是QMap类型的容器,用来选定操作的tabWidget界面,将界面与0~7进行键值匹配,简化后续操作
//如在将地址保存进各个表格的第一列时,用迭代器循环访问,用for循环遍历0~7就相当于对界面进行遍历
tables.clear();
tables.insert(0,ui->tableWidget_realState);
tables.insert(1, ui->tableWidget_debugAddr);
tables.insert(2,ui->tableWidget_jiaobiao);
tables.insert(3,ui->tableWidget_cell);
tables.insert(4,ui->tableWidget_electric);
tables.insert(5,ui->tableWidget_ground);
tables.insert(6,ui->tableWidget_shortCurrent);
tables.insert(7,ui->tableWidget_node);
//设置表格的样式
QMap<int, QTableWidget*>::iterator t_iter;
QString horiStyle = "QHeaderView::section \
{background-color:lightblue;color: black;padding-left: 4px;border: 1px solid #6c6c6c}";
QString vertStyle = "QHeaderView::section \
{background-color:skyblue;color: black;padding-left: 4px;border: 1px solid #6c6c6c}";
QString tabBarStyle = "QTabBar::tab {min-width:100px;color: black;border: 1px solid;\
border-top-left-radius: 5px;border-top-right-radius: 5px;padding:5px;}\
QTabBar::tab:selected {background:lightblue;}";
for (t_iter = tables.begin(); t_iter != tables.end(); t_iter++)
{
t_iter.value()->setColumnHidden(0, true);
t_iter.value()->setAlternatingRowColors(true);
t_iter.value()->horizontalHeader()->setStyleSheet(horiStyle);
t_iter.value()->verticalHeader()->setStyleSheet(vertStyle);
}
// ui.tableWidget_config->horizontalHeader()->setStyleSheet(horiStyle);
// ui.tableWidget_config->verticalHeader()->setStyleSheet(vertStyle);
// ui.tabWidget_caiji_cfg->setStyleSheet(tabBarStyle);
// ui.tableWidget_xiaobiao->horizontalHeader()->setDefaultSectionSize(75);
caijiFuncPtrs.clear();
caijiFuncPtrs.insert(0, &MainWindow::saveRealStateParam);
caijiFuncPtrs.insert(1, &MainWindow::saveDebugAddrParam);
caijiFuncPtrs.insert(2, &MainWindow::saveMeterParam);
caijiFuncPtrs.insert(3, &MainWindow::saveBattaryParam);
caijiFuncPtrs.insert(4, &MainWindow::saveEleFieldParam);
caijiFuncPtrs.insert(5, &MainWindow::saveGroundCurParam);
caijiFuncPtrs.insert(6, &MainWindow::saveShortCurParam);
caijiFuncPtrs.insert(7, &MainWindow::saveNodeInfoParam);
// connect(ui->btnIndicatorRead,SIGNAL(clicked()),this,SLOT(on_button_write()));
// connect(ui->btnIndicatorWrite,SIGNAL(clicked()),this,SLOT(on_button_read()));
}
void MainWindow::treeMenuFun(QTreeWidgetItem *item, int column)
{
if(qApp->mouseButtons() == Qt::RightButton)
{
if(item->type()==0)
{
QAction addPart(QString::fromLocal8Bit("增加采集设备"),this);
connect(&addPart,SIGNAL(triggered()),this,SLOT(showAddCaijiDevice()));
QMenu menu(ui->treeWidgetDevice);
menu.addAction(&addPart);
menu.exec(QCursor::pos());
//pos()返回主屏幕光标(热点)在全局屏幕坐标中的位置。您可以调用QWidget::mapFromGlobal()将其转换为部件坐标。
}
else if(item->type() == 1)
{
QAction readPart(QString::fromLocal8Bit("读参数"), this);
QAction writePart(QString::fromLocal8Bit("写参数"), this);
QAction removePart(QString::fromLocal8Bit("删除采集设备"), this);
QAction modifyAddr(QString::fromLocal8Bit("修改设备地址"),this);
QAction AddNode(QString::fromLocal8Bit("添加结点信息"),this);
QAction CaijiUnit(QString::fromLocal8Bit("采集单元复归"),this);
connect(&writePart,SIGNAL(triggered()),this,SLOT(on_write_single()));
connect(&readPart,SIGNAL(triggered()),this,SLOT(on_read_single()));
connect(&removePart, SIGNAL(triggered()), this, SLOT(showRemoveDevice()));
connect(&modifyAddr,SIGNAL(triggered()),this,SLOT(changeAddr()));
QMenu menu(ui->treeWidgetDevice);
menu.addAction(&readPart);
menu.addAction(&writePart);
menu.addAction(&modifyAddr);
menu.addAction(&removePart);
menu.addAction(&AddNode);
menu.addAction(&CaijiUnit);
menu.exec(QCursor::pos());
}
}
}
void MainWindow::showAddCaijiDevice()
{
addrDialog->set_fouce();
addrDialog->exec();
if (addrDialog->isOk == false)
{
return;
}
QString devAddr = QString::number(addrDialog->addr, 16);//
while (devAddr.size() < 6)
{
devAddr.prepend("0");
}
//treeWidget
QTreeWidgetItemIterator it(ui->treeWidgetDevice);
while (*it)
{
if ((*it)->text(0) == devAddr)
{
(*it)->setSelected(true);
return;
}
++it;
}
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidgetDevice->currentItem(),QStringList(devAddr),1);
//构造指定类型的tree小部件项,并将其附加到给定父组件中的项。给定的字符串列表将被设置为项目中每一列的项目文本。
ui->treeWidgetDevice->sortItems(0, Qt::AscendingOrder);
//根据给定列中的值,以指定的顺序对小部件中的项进行排序。根据给定列中的值,以指定的顺序对小部件中的项进行排序。
//Qt::AscendingOrder顺序
//Qt::DescendingOrder逆序
int rowNo = ui->treeWidgetDevice->currentItem()->indexOfChild(item);
//currentItem返回树小部件中的当前项目
//indexOfChild返回项的子元素列表中给定子元素的索引。
QMap<int, QTableWidget*>::iterator t_iter;
for (t_iter = tables.begin(); t_iter != tables.end(); t_iter++)
{
t_iter.value()->insertRow(rowNo);
for (int i = 0; i < t_iter.value()->columnCount(); i++)
{
t_iter.value()->setItem(rowNo, i, new QTableWidgetItem);
}
t_iter.value()->item(rowNo, 0)->setText(QString::number(rowNo));
t_iter.value()->item(rowNo, 1)->setText(devAddr);
t_iter.value()->item(rowNo, 1)->setFlags(Qt::NoItemFlags);
//QTableWidgetItem *item = t_iter->second->item(rowNo, 1);
//item->setFlags(item->flags() & (~Qt::ItemIsEditable));
}
// int index = 0;
// for (int i = 0; i < headItems.count(); i++)
// {
// if (headItems.at(i).contains(QString::fromLocal8Bit("��ֵ")))
// {
// QString stdVal = QString::number(vecStd.at(index));
// ui->tableWidget_jiaobiao->item(rowNo, i)->setText(stdVal);
// ui->tableWidget_jiaobiao->item(rowNo, i)->setBackgroundColor(QColor(240,130,120));
// index++;
// }
// else if (headItems.at(i).contains(QString::fromLocal8Bit("����ֵ")))
// {
// ui->tableWidget_jiaobiao->item(rowNo, i)->setBackgroundColor(QColor(150,250,120));
// }
// else if (headItems.at(i).contains(QString::fromLocal8Bit("ʵ��ֵ")))
// {
// ui->tableWidget_jiaobiao->item(rowNo, i)->setBackgroundColor(QColor(160,230,250));
// }
// }
ui->treeWidgetDevice->setItemsExpandable(false);
//此属性保存项目是否可由用户展开。此属性保存用户是否可以交互式地展开和折叠项。默认情况下,此属性为true。
ui->treeWidgetDevice->expandAll();
//展开所有可展开的物品。警告:如果模型包含大量项目,此功能将需要一些时间来执行。
}
void MainWindow::changeAddr()
{
QTreeWidgetItem *item =ui->treeWidgetDevice->currentItem();
int rowNo = item->parent()->indexOfChild(item);
modifyDialog->isOk = false;
modifyDialog->exec();
if (modifyDialog->isOk == false)
{
return;
}
QString devAddr = QString::number(modifyDialog->addr, 16);
while (devAddr.size() < 6)
{
devAddr.prepend("0");
}
QString devName = QString::fromLocal8Bit("") + devAddr;
item->setText(0, devAddr);
QMap<int, QTableWidget*>::iterator t_iter;
for (t_iter = tables.begin(); t_iter != tables.end(); t_iter++)
{
t_iter.value()->item(rowNo, 1)->setText(devAddr);
}
}
void MainWindow::showRemoveDevice()
{
QTreeWidgetItem *item = ui->treeWidgetDevice->currentItem();
int rowNo = item->parent()->indexOfChild(item);
if(item->parent() != NULL)
item->parent()->removeChild(item);
QMap<int, QTableWidget*>::iterator t_iter;
for (t_iter = tables.begin(); t_iter != tables.end(); t_iter++)
{
t_iter.value()->removeRow(rowNo);
}
}
void MainWindow::saveRealStateParam()
{}
void MainWindow::saveDebugAddrParam()
{}
void MainWindow::saveMeterParam()
{}
void MainWindow::saveBattaryParam()
{}
void MainWindow::saveEleFieldParam()
{}
void MainWindow::saveGroundCurParam()
{}
void MainWindow::saveShortCurParam()
{}
void MainWindow::saveNodeInfoParam()
{}