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();
把选中时的一行数据存到一起,显示在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的
//获取IP值的lineedit更改信息
connect(ui->m_ip_lineEdit,
SIGNAL(textEdited(QString)),
this,
SLOT(textEdited(QString)));
private slots:
void on_m_ip_lineEdit_textEdited(const QString &text);
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();