如何更新项目委托的几何形状

问题描述 投票:0回答:1

QT6.8.0,Ubuntu 24.10。 我写了一个简单的代表,以在a

QSqlTableModel
中显示。 它以给定数量的小数为特定的浮点数格式化。
issue

当表将列的宽度调整为内容时,它会忽略新的内容大小(由于添加了新的小数,大于初始内容)。

工程和完整的mre

Mainwindow.h

QTableView

Mainwindow.cpp

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSqlRelationalTableModel> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QSqlRelationalTableModel *_model = nullptr; }; #endif // MAINWINDOW_H

MainWindow.ui

#include "mainwindow.h" #include "ui_mainwindow.h" #include "delegatereal.h" #include <QSqlError> #include <QSqlRecord> #include <QSqlQuery> #include <QSqlRelationalDelegate> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "mydb"); db.setDatabaseName("mydb.sql"); db.open(); QSqlQuery query("DROP TABLE IF EXISTS foo", db); query.exec(); QString sql = "CREATE TABLE foo \ (name TEXT NOT NULL, \ v FLOAT NOT NULL, \ PRIMARY KEY (name));"; query.prepare(sql); query.exec(); _model = new QSqlRelationalTableModel(this, db); _model->setTable("foo"); _model->setEditStrategy(QSqlRelationalTableModel::OnRowChange); ui->table->setSortingEnabled(false); ui->table->setModel(_model); ui->table->setItemDelegate(new QSqlRelationalDelegate(this)); ui->table->setItemDelegateForColumn(1, new DelegateReal(5)); ui->table->setFocusPolicy(Qt::TabFocus); query.exec("INSERT INTO foo (name, v) VALUES ('aaa', 1.234);"); query.exec("INSERT INTO foo (name, v) VALUES ('bbb', 2.345);"); query.exec("INSERT INTO foo (name, v) VALUES ('ccc', 3.465);"); _model->select(); ui->table->resizeColumnsToContents(); } MainWindow::~MainWindow() { delete ui; }

delegatereal.h

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0" rowspan="2"> <widget class="QTableView" name="table"/> </item> </layout> </widget> </widget> <resources/> <connections/> </ui>

逆转

预期的行为results

trials

i播放了expected#ifndef DELEGATEREAL_H #define DELEGATEREAL_H #include <QStyledItemDelegate> #include <QDoubleSpinBox> #include <QApplication> #include <QDebug> class DelegateReal : public QStyledItemDelegate { Q_OBJECT public: DelegateReal(int decimals, QObject *parent = nullptr) : QStyledItemDelegate(parent), _decimals(decimals) { } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QDoubleSpinBox *editor = new QDoubleSpinBox(parent); editor->setFrame(false); editor->setDecimals(_decimals); return editor; } void setEditorData(QWidget *editor, const QModelIndex &index) const override { int value = index.model()->data(index, Qt::EditRole).toInt(); QDoubleSpinBox *w = static_cast<QDoubleSpinBox*>(editor); w->setValue(value); } void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { QDoubleSpinBox *w = static_cast<QDoubleSpinBox*>(editor); w->interpretText(); double value = w->value(); model->setData(index, value, Qt::EditRole); } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override { editor->setGeometry(option.rect); } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionViewItem opt = option; initStyleOption(&opt, index); QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); opt.text = opt.locale.toString(opt.locale.toFloat(opt.text), 'f', _decimals); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); } private: int _decimals; }; #endif // DELEGATEREAL_H 中的大小,但这当然只会影响编辑器(也就是我编辑单元格时):

QRect 我还尝试设置

updateEditorGeometry()

函数内的宽度:

void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
    QRect rect(option.rect);
    rect.setWidth(100);
    editor->setGeometry(rect);
}
实际上会扩大彩绘区域,但仍然错误地调整了圆柱:


问题
为了更新内容的几何形状,我需要更改什么?

提出代表的点是能够设置小数的数量(或其他更改显示的文本),您可以重新进来paintpaint()

而不是

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionViewItem opt = option; initStyleOption(&opt, index); QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); opt.text = opt.locale.toString(opt.locale.toFloat(opt.text), 'f', _decimals); opt.rect.setWidth(100); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); } 。反过来,这是从默认实现中调用的。 反过来,QStyledItemDelegate::displayText()

qt qtableview qt6 qitemdelegate
1个回答
0
投票
如果不满足需求,重新进化并将文本值更简单,而不是在

paint()中更改文本值,则出于相同的原因,即自动选择该值。

Https://codebrowser.dev/qt6/qtbase/src/widgets/widgets/itemviews/qstyleditemdelemdelemdelemdelegate.cpp.html#_znk19qstyleditemdelemdelemdelemdelemdelemdelemdelemdelemdelemdelemdelemdelegate11displaytexterk8qvariantrk7qliark7Qlocale®
为了进一步参考,以下是如何计算列的大小提示,具体取决于编辑器是否打开。
https://codebrowser.dev/qt6/qtbase/src/widgets/itemviews/qtableview.cpp.html#_ZNK17QTableViewPrivate17widthHintForIndexERK11QModelIndexiRK20QStyleOptionViewItem

    
	
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.