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

学习笔记

1.利用槽函数连接一个双击的动作与表格,找到表格对应的指针
2. 根据指针找到对应文本信息,接收,再绑定到对应edit中Qt实现阅读Qtablewidget的值,传递至lineedit显示,edit上修改再传回表格_第1张图片

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();

你可能感兴趣的:(Qt实现阅读Qtablewidget的值,传递至lineedit显示,edit上修改再传回表格)