问题记录-QTableView修改列宽不及时问题

文章讲述了在使用QTableView时,设置表头信息和填充数据后,如果先设置列宽再更新界面,setColumnWidth的效果可能不明显。解决办法是在调用setHorizontalHeaderLabels后立即更新界面,然后再设置列宽并再次更新,确保宽度生效。

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

在使用QTableView中,使用setHorizontalHeaderLabels()方法设置表头信息后,马上填充表格内容,然后通过setColumnWidth()设置列宽,最后使用update()更新界面,发现setColumnWidth()的实际效果没有。代码如下:

QStringList titles;
QTableView tableView = new QTableView();

QStandardItemModel *pItemModel = new QStandardItemModel();

tableView->setModel(pItemModel);

// 设置titles内容
// ...

pItemModel->setHorizontalHeaderLabels(titles);

// 添充item
// tableView->setItem(); ...

// 设置列宽
for (int i = 0; i < titles.count(); ++i) {
	tableView->setColumnWidth(i, 100);
}

// 强制更新界面
update();

解决方案:在setHorizontalHeaderLabels()方法之后强制更新界面。代码如下:

QStringList titles;
QTableView tableView = new QTableView();

QStandardItemModel *pItemModel = new QStandardItemModel();

tableView->setModel(pItemModel);

// 设置titles内容
// ...

pItemModel->setHorizontalHeaderLabels(titles);

// 强制更新界面
update();

// 添充item
// tableView->setItem(); ...

// 设置列宽
for (int i = 0; i < titles.count(); ++i) {
	tableView->setColumnWidth(i, 100);
}

// 强制更新界面
update();

望能者看到该贴后能给出具体回答。

#include "c.h"//借还管理 #include "ui_c.h" #include "a.h" C::C(QWidget *parent) : QMainWindow(parent) , ui(new Ui::C) { ui->setupUi(this); this->setWindowTitle("借还管理"); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // SQLite示例 db.setDatabaseName("D:/qtfile/serve1/data.db"); // 数据库文件路径 if (!db.open()) { qDebug() << "数据库连接失败:" << db.lastError().text(); return; } //创建表 QSqlQuery query; if (!query.exec("CREATE TABLE IF NOT EXISTS equipment (" "id INTEGER PRIMARY KEY AUTOINCREMENT," "name TEXT NOT NULL," "type TEXT NOT NULL," "status INTEGER DEFAULT 0," "lend_out_date DATE," "return_date DATE," "people TEXT NOT NULL," "phone TEXT NOT NULL);")) { qDebug() << "建表错误:" << query.lastError().text(); } //插入两条数据 QSqlQuery checkQuery("SELECT COUNT(*) FROM equipment;"); if (checkQuery.next() && checkQuery.value(0).toInt() == 0) { QSqlQuery insertQuery; // 第一条数据 insertQuery.prepare("INSERT INTO equipment (name, type, status, lend_out_date,return_date,people,phone) " "VALUES (:name, :type, :status, :date_1, :date_2, :people, :phone)"); insertQuery.bindValue(":name", "光谱分析仪"); insertQuery.bindValue(":type", "实验室设备"); insertQuery.bindValue(":status", 0); insertQuery.bindValue(":date_1", QDate(2023, 5, 10)); insertQuery.bindValue(":date_2", QDate()); insertQuery.bindValue(":people", "张洪平"); insertQuery.bindValue(":phone", "19923688556"); if (!insertQuery.exec()) { qDebug() << "插入数据失败:" << insertQuery.lastError().text(); } // 第二条数据 insertQuery.prepare("INSERT INTO equipment (name, type, status, lend_out_date, return_date, people, phone ) " "VALUES (:name, :type, :status, :date_1, :date_2, :people, :phone)"); insertQuery.bindValue(":name", "离心机"); insertQuery.bindValue(":type", "生物设备"); insertQuery.bindValue(":status", 1); insertQuery.bindValue(":date_1", QDate(2022, 11, 20)); insertQuery.bindValue(":date_2", QDate(2023, 7, 9)); insertQuery.bindValue(":people", "张洪平"); insertQuery.bindValue(":phone", "19923688556"); if (!insertQuery.exec()) { qDebug() << "插入数据失败:" << insertQuery.lastError().text(); } } model = new QSqlTableModel(this); model->setTable("equipment"); // 设置数据库表名 model->setEditStrategy(QSqlTableModel::OnManualSubmit); // 手动提交修改 model->setSort(model->fieldIndex("ID"),Qt::AscendingOrder);//按id排序 model->select();//加载数据 // 设置标题 model->setHeaderData(0, Qt::Horizontal, tr("ID")); model->setHeaderData(1, Qt::Horizontal, tr("设备名称")); model->setHeaderData(2, Qt::Horizontal, tr("设备类型")); model->setHeaderData(3, Qt::Horizontal, tr("借还状态")); model->setHeaderData(4, Qt::Horizontal, tr("借出日期")); model->setHeaderData(5,Qt::Horizontal, tr("归还日期")); model->setHeaderData(6, Qt::Horizontal, tr("借用人")); model->setHeaderData(7,Qt::Horizontal, tr("手机")); // 加载数据 if (!model->select()) { qDebug() << "数据加载失败:" << model->lastError().text(); } ui->tableView->setModel(model);//绑定模型 ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableView->setModel(model); ui->tableView->resizeColumnsToContents(); // 自动调整 ui->tableView->show(); } C::~C() { delete ui; } void C::on_pushButton_clicked()//返回按钮 { A *w=new A(); w->show(); this->hide(); } void C::on_pushButton_2_clicked()//退出按钮 { this->close(); } //借出记录 void C::on_action_triggered() { model->setFilter(""); } //归还记录 void C::on_action_2_triggered(){ model->setFilter("status <> 0");// 排除状态为0的记录 } void C::on_action_3_triggered() { QDialog dialog(this); dialog.setWindowTitle("添加新记录"); dialog.setMinimumWidth(300); // 创建布局 QVBoxLayout *mainLayout = new QVBoxLayout(&dialog); QFormLayout *formLayout = new QFormLayout(); // 创建输入控件 QLineEdit *nameEdit = new QLineEdit(&dialog);//equipment QLineEdit *typeEdit = new QLineEdit(&dialog); QLineEdit *lend_out_dateEdit = new QLineEdit(&dialog); QLineEdit *peopleEdit= new QLineEdit(&dialog); QLineEdit *phoneEdit= new QLineEdit(&dialog); // 添加控件到表单 formLayout->addRow("设备名称:", nameEdit); formLayout->addRow("设备类型:", typeEdit); formLayout->addRow("借出时间:", lend_out_dateEdit); formLayout->addRow("借用人:", peopleEdit); formLayout->addRow("手机·:", phoneEdit); // 创建按钮 QDialogButtonBox *buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog); mainLayout->addLayout(formLayout); mainLayout->addWidget(buttonBox); // 连接按钮信号 connect(buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); // 显示对话框并处理结果 if (dialog.exec() == QDialog::Accepted) { // 获取输入值 QString name = nameEdit->text().trimmed(); QString type = typeEdit->text().trimmed(); QString date_1= lend_out_dateEdit->text().trimmed(); QString date_2= ""; QString status = "0"; QString people = peopleEdit->text().trimmed(); QString phone = phoneEdit->text().trimmed(); // 验证输入 if (name.isEmpty()) { QMessageBox::warning(this, "输入错误", "设备名不能为空"); return; } // 在模型末尾插入新行 int rowNum = model->rowCount(); model->insertRow(rowNum); // 设置新记录的值 model->setData(model->index(rowNum, model->fieldIndex("ID")), rowNum+1); model->setData(model->index(rowNum, model->fieldIndex("设备名称")), name); model->setData(model->index(rowNum, model->fieldIndex("设备类型")), type); model->setData(model->index(rowNum, model->fieldIndex("借还状态")), status); model->setData(model->index(rowNum, model->fieldIndex("借用时间")), date_1); model->setData(model->index(rowNum, model->fieldIndex("归还时间")), date_2); model->setData(model->index(rowNum, model->fieldIndex("借用人")),people); model->setData(model->index(rowNum, model->fieldIndex("手机")), phone); // 自动滚动到新添加的行 ui->tableView->scrollToBottom(); } } 为什么最终table view仅显示了ID
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值