QTableWidget实现列表界面,滑动选择,并存储数据库

这段代码展示了如何在C++中创建一个带有列表的QFrame,用户可以通过滑动选择表格项,高亮显示并存储选中状态于数据库。代码涉及表格布局、信号与槽的连接以及处理多选情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 这段代码是定义各一个框,框里面放一个列表,列表可被滑动选中,并将选中的表格,进行高亮显示,可以滑动将高亮选中的表格进行取消,表格的状态存放在数据库中。这个展示的视频我上传了,不知道怎么显示不在这里,好像在博客别的地方。

样式是这样的,可以滑动选择和取消。

    //右上框5
    QFrame *borderFrame5 = new QFrame(this);
    borderFrame5->setFrameStyle(QFrame::Box);
    borderFrame5->setGeometry(758,15,292,529);
    borderFrame5->setStyleSheet("QFrame{"
                               "border-radius: 5px;"
                               "border: 1px solid #455364;"
                              "}");


    QLabel  *receiverDataTableTitle = new QLabel("接受以下主机数据:");

    receiverDataTableWidget = new NetTableWidget(1);
    receiverDataTableWidget->setFixedSize(290,470);
    //创建的行和列 5行3列
    receiverDataTableWidget->setRowCount(64);
    receiverDataTableWidget->setColumnCount(3);
    //自适应行高
    receiverDataTableWidget->resizeRowsToContents();

    //隐藏最左侧的列(第0列)
    QHeaderView *customerVerticalHeader = new QHeaderView(Qt::Vertical);
    customerVerticalHeader->setVisible(false);


    receiverDataTableWidget->setVerticalHeader(customerVerticalHeader);
    receiverDataTableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     receiverDataTableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    //Qt::ScrollBarAsNeeded 滚动条将根据表格内容是否溢出来显示或者隐藏
    receiverDataTableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

    //设置垂直表头的大小策略
    QHeaderView *horizontalHeader = receiverDataTableWidget->horizontalHeader();
    horizontalHeader->setSectionResizeMode(QHeaderView::Fixed); //设置固定大小

    QStringList horizontalHeaderLabels;
    horizontalHeaderLabels << "火警" << "故障" << "联动";
    receiverDataTableWidget->setHorizontalHeaderLabels(horizontalHeaderLabels);
    receiverDataTableWidget->setHorizontalHeaderLabels(horizontalHeaderLabels);


    //一共有64个主机,这里创建一个主机号列表,一个主机有三种状态,所以是111,222,333
    QStringList data;
    for(int i=1;i<195;i++){
        for(int j=0;j<3;j++)
            data.append(QString::number(i));
    }


    //将主机号显示在界面,同时从数据库读取列表中表格被选中状态
    int row =0;
    int col =0;
    for(const QString &item : data){
        QTableWidgetItem *tableItem = new QTableWidgetItem(item);
        int h=_pDataAccess->cfg_host_event_select(row,col);
        if(h==0)//若没有被选中则界面标记为选中状态
             tableItem->setBackground(QBrush(QColor(25,35,45)));
        else if(h==1)//若已经被选中了,则取消选中状态
           tableItem->setBackground(QBrush(QColor(69,83,100)));
        receiverDataTableWidget->setItem(row,col,tableItem);
        col++;
        if(col==3){
            col=0;
            row++;
        }
    }

   //将主机号文本居中
    for (int i = 0; i<64; i++)
    {
        for (int j = 0; j<3; j++)
        {
            receiverDataTableWidget->item(i,j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        }
    }

    receiverDataTableTitle->setStyleSheet("border:none;color:white;");
    horizontalHeader->setStyleSheet("QHeaderView::section{border:0.7px solid #455364;background-color:#19232d;color:white;}");
 //   receiverDataTableWidget->setStyleSheet("QTableWidget::item{border:2px solid #455364;background-color:#19232d;color:white;}"
  //                                         "QTableWidget::item:selected{background-color:lightblue;}");
    receiverDataTableWidget->setFocusPolicy(Qt::NoFocus);
    //添加到mainLayout
    QVBoxLayout  *upperRightMainLayout = new QVBoxLayout;
    //添加到widget容器中去
    upperRightMainLayout->addWidget(receiverDataTableTitle);
    upperRightMainLayout->addWidget(receiverDataTableWidget);
    upperRightMainLayout->addStretch();

    borderFrame5->setLayout(upperRightMainLayout);

 这段代码本来使用itemSelectionChanged作为触发信号,但多选时,他会依次叠加发送多次。所以这里的信号是自己重写的onMouseUp。当多选时,鼠标释放时,触发信号。

    //接收主机事件列表
    // 连接表格的单元格修改信号到槽函数itemSelectionChanged
    connect(receiverDataTableWidget, &NetTableWidget::onMouseUp,this->receiverDataTableWidget, [=]() {
        QList<QTableWidgetItem*> selectItems = receiverDataTableWidget->selectedItems();
        qDebug() << "selectedItems("<<selectItems.size()<<")----------";
        for(auto item:selectItems)
        {
            qDebug() << item->row() <<", "<< item->column();
            int h=_pDataAccess->cfg_host_event_select(item->row(),item->column());
            if(h==0)//若没有被选中则界面标记为选中状态
                 item->setBackground(QBrush(QColor(69,83,100)));
            else if(h==1)//若已经被选中了,则取消选中状态
               item->setBackground(QBrush(QColor(25,35,45)));
            _pDataAccess->cfg_host_event(item->row(),item->column());
       }
        receiverDataTableWidget->clearSelection();
    });

 重新的方法为:

class NetTableWidget : public QTableWidget
{
    Q_OBJECT

public:
    NetTableWidget(int ll){

    };
    void mouseReleaseEvent(QMouseEvent *event){
        emit onMouseUp();
        qDebug()<<"mouse up event";
        QTableWidget::mouseReleaseEvent(event); // 将事件传递给父类处理
    }

signals:
    void onMouseUp();
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值