Qt实现阅读Qtablewidget的值,传递至lineedit显示,edit上修改再传回表格

学习笔记

1.利用槽函数连接一个双击的动作与表格,找到表格对应的指针
2. 根据指针找到对应文本信息,接收,再绑定到对应edit中在这里插入图片描述

1.首先在之前的tablewidget格式设定时选择了一次选中一行

//单击选择一行
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//设置只能选择一行,不能多行选中
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); 

2.连接connect(使用了双击DoubleClick,也可用单击触发)

//获取点击的单元格位置信息
connect(ui->tableWidget,
	SIGNAL(doubleClicked(QModelIndex)),
	this,
	SLOT(getItem(QModelIndex))); 

3.在头文件中声明槽函数,

private slots: 
	void getItem(const QModelIndex &index);

并在*.cpp文件里实现.

void MainWindow::double_selected_action(const QModelIndex &index) { 
    //设备编号
    QString num = ui->tableWidget->model()->index(index.row(),1).data().toString(); //使用一个字符串接收
    ui->m_num_lineEdit->setText(num); //把这个字符串显示在相应的lineEdit控件上
    //IP地址
    QString ip = ui->tableWidget->model()->index(index.row(),3).data().toString();
    ui->m_ip_lineEdit->setText(ip);
    //其他把列数修改为对应列,序号皆为由0开始
    }

加注:上面用index来查找item内容用的函数太多了,可以换为下面的

 ui->tableWidget->item(index.row(), index.column())->text();

!!6/16更新:表格数据传入lineedit实现部分再次更新写法

把选中时的一行数据存到一起,显示在edit的过程就变成了在这一串数据中寻址。(一些控件改了名,这是无所谓的)

void MainWindow::mock_data() {
    //设置表格项
    QString type[] = {"A", "B", "C", "D", "E"};  //一些模拟数据
    QString state[] = {"激活", "激活", "激活", "激活", "激活"};
    QString ipadd[] = {"192.1", "192.3", "192.4", "192.7", "192.9"};
    for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
        QStringList contents;
        // 编号, 设备类型, 状态, ip
        contents << QString::number(1 + i) << type[i] << state[i] << ipadd[i];
        auto num_item = new QTableWidgetItem(contents[0]);
        num_item->setData(Qt::UserRole, contents);
        
        ui->tableWidget->setItem(i, 1, num_item);
        ui->tableWidget->setItem(i, 2, new QTableWidgetItem(contents[1]));
        ui->tableWidget->setItem(i, 3, new QTableWidgetItem(contents[2]));
        ui->tableWidget->setItem(i, 4, new QTableWidgetItem(contents[3]));
    }
}
void MainWindow::double_selected_action(const QModelIndex &index) {
    // [编号, 设备类型, 激活状态, ip地址, 端口.....]
    auto contents = ui->tableWidget->item(index.row(), 1)->data(Qt::UserRole).toStringList();
    ui->edit_name->setText(contents[1]); //把这个字符串显示在相应的lineEdit控件上
    ui->edit_ip->setText(contents[3]);
}

6/12
写了修改功能,还是用槽函数,先写了修改IP的

  1. connect连接。使用的textEdited检验是否修改了edit的信息
//获取IP值的lineedit更改信息
connect(ui->m_ip_lineEdit,
        SIGNAL(textEdited(QString)),
        this,
        SLOT(textEdited(QString)));
  1. 声明
 private slots:
	   void on_m_ip_lineEdit_textEdited(const QString &text);
  1. 先实现存储修改后的edit文本信息
void MainWindow::on_m_ip_lineEdit_textEdited(const QString &text)
{
    //用字符串存储修改后的IP值
    QString ip2 = ui->m_ip_lineEdit->text();
}

这里如果想要直接把改变后的值传到表格里,可以直接在上面写。
也可以加入一个按钮btn在判定密码正确后再实现传递。
还没学会用数据库存储用户动态设置的密码,先写成固定密码。

按钮的槽函数实现传输

void MainWindow::on_m_btn_change_clicked()
{
    //按下按钮 判断密码是否正确
    //正确则把修改后的edit值传给tablewidget
    //错误则弹出提示框 密码错误
    if(ui->m_code_lineEdit->text().trimmed() == "123")    {      
    //加trimmed()可以去除字符串开头和结尾的空白字符,也可不加
        QString ip2 = ui->m_ip_lineEdit->text();
        QTableWidgetItem * itemip2 = new QTableWidgetItem(ip2);
        ui->tableWidget->setItem(m_selected_row,4,itemip2);//4是我的表格里IP对应列数,根据需要自行确定
        //!这里取之前双击后进行编辑的行的行号,m_selected_row是一个定义的全局变量
    }
    else    {
        QMessageBox::warning(this,tr("warning"),tr("密码错误!"),QMessageBox::Yes);   //如果不正确,弹出警告框
        ui->m_code_lineEdit->clear();      //清空密码框,并且光标自动跳转到输入框
        ui->m_code_lineEdit->setFocus();
    }

!上面的m_selected_row是一个定义的全局变量,拿来放置在进行双击选择待编辑行时的行号
定义方式:

//头文件里
private:
    Ui::MainWindow *ui;//自带的ui界面
    int m_selected_row;//全局变量

*.cpp文件里的位置,-1为设的

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), m_selected_row(-1), ui(new Ui::MainWindow) {

记录双击的行号(在getitem那里的槽函数实现下)

m_selected_row = index.row();
  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以通过以下步骤在QT实现qtablewidget右击表头进行筛选: 1.为QTableWidget设置右键菜单: ```c++ QMenu *menu = new QMenu(ui->tableWidget); ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableWidget->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint))); ``` 2.在showMenu()函数创建菜单项,并连接槽函数: ```c++ void MainWindow::showMenu(QPoint pos) { QPoint globalPos = ui->tableWidget->mapToGlobal(pos); QMenu *menu = new QMenu(this); QAction *filterAction = new QAction(tr("Filter"), this); connect(filterAction, SIGNAL(triggered()), this, SLOT(showFilterDialog())); menu->addAction(filterAction); menu->popup(globalPos); } ``` 3.在showFilterDialog()函数创建筛选对话框,并执行筛选操作: ```c++ void MainWindow::showFilterDialog() { QDialog *dialog = new QDialog(this); QVBoxLayout *layout = new QVBoxLayout(dialog); QComboBox *columnCombo = new QComboBox(dialog); QLineEdit *filterEdit = new QLineEdit(dialog); QPushButton *okButton = new QPushButton(tr("OK"), dialog); layout->addWidget(columnCombo); layout->addWidget(filterEdit); layout->addWidget(okButton); dialog->setLayout(layout); dialog->setWindowTitle(tr("Filter")); dialog->setModal(true); connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept())); if(dialog->exec() == QDialog::Accepted) { QString filterString = filterEdit->text(); int column = columnCombo->currentIndex(); QTableWidget *tableWidget = ui->tableWidget; for(int i = 0; i < tableWidget->rowCount(); i++) { QTableWidgetItem *item = tableWidget->item(i, column); if(item) { if(item->text().contains(filterString, Qt::CaseInsensitive)) { tableWidget->showRow(i); } else { tableWidget->hideRow(i); } } } } } ``` 以上就是在QT实现qtablewidget右击表头进行筛选的方法,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值