QT的学习---》tabwidget对表格的操作

在学习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()
{}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值