Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

QSpinBox dans un QTableWidget

Bonjour à tous ;)
J'ai un petit souci avec un QTableWidget. J'explique: j'ai une liste de coordonnées de points (X, Y, Z) dans un QTableWidget. Chaque coordonnée est un QSpinBox (QDoubleSpinBox en fait, mais on s'en fout :D). Donc en gros, mon QTableWidget contient plein de QSpinBox.
Le problème est que j'aimerai, à chaque fois que l'utilisateur modifie une donnée d'une de ces QSpinBox je lance une procédure. J'ai essayé ceci:
//column zero
QTableWidgetItem *activate = new QTableWidgetItem("Activate");
activate->setFlags(Qt::ItemIsUserCheckable);
activate->setCheckState(Qt::Checked);

//column X
QDoubleSpinBox *x = new QDoubleSpinBox();
connect(x, SIGNAL(valueChanged(double)), this, SLOT(somethingChanged(double)));
x->setValue(0.0);

//column Y
QDoubleSpinBox *y = new QDoubleSpinBox();
connect(y, SIGNAL(valueChanged(double)), this, SLOT(somethingChanged(double)));
y->setValue(0.0);

//column Z
QDoubleSpinBox *z = new QDoubleSpinBox();
connect(z, SIGNAL(valueChanged(double)), this, SLOT(somethingChanged(double)));
z->setValue(0.0);

//add a line
ui.listPoints->setRowCount(n_rows+1);

//change its height & color
ui.listPoints->setRowHeight(n_rows, 20);

ui.listPoints->setItem(n_rows, 0, activate);
ui.listPoints->setCellWidget(n_rows, 1, x);
ui.listPoints->setCellWidget(n_rows, 2, y);
ui.listPoints->setCellWidget(n_rows, 3, z);

Mais lorsque je modifie une des QSpinBox avec les flèches, la fonction somethingChanged n'est pas appelée! Quelqu'un sait où se trouve le problème?

Réponses

  • December 2011 modifié
    Même problème :(
    lorsque je modifie une des QSpinBox avec les flèches, la fonction somethingChanged (qui est un SLOT ) n'est pas appelée! Quelqu'un sait où se trouve le problème?
  • Hello,

    Si tu re-ecrit tes connect comme ceci, ca donne quoi ?

    bool ok;
    ok = connect ( blablabla...); Q_ASSERT( ok );
  • Salut
    Utilise les SpinBox comme des ItemsDelegate dans ta tableWidget.
    Voici le code:
    fichier.h

    //fichier.h
    class SpinBoxDelegate:public QItemDelegate{
    Q_OBJECT

    public:
    SpinBoxDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;

    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const;

    void updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &index) const;
    };
    fichier.cpp

    // fichier.cpp

    QWidget* SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    // ici c'est la partie creation de ta spinbox donc tu peux faire des modifications a ton gout
    QDoubleSpinBox *editor=new QDoubleSpinBox(parent);
    editor->setAccelerated(true);
    editor->setDecimals(2);
    editor->setMaximum(20);
    editor->setMinimum(-1.0);
    editor->setSingleStep(0.25);

    return editor;

    }

    void SpinBoxDelegate::setEditorData(QWidget *editor,
    const QModelIndex &index) const
    {
    float value = index.model()->data(index, Qt::EditRole).toFloat();

    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    spinBox->setValue(value);
    }

    void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const
    {
    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    spinBox->interpretText();
    float value = spinBox->value();


    model->setData(index, value, Qt::EditRole);
    }

    void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
    {
    editor->setGeometry(option.rect);
    }

    SpinBoxDelegate::SpinBoxDelegate(QObject *parent){

    // constructeur de la classe
    }

    ensuite tu peux les ajouter dans ta table

    tableWidget->setItemDelegateForColumn(/* numero colonne */ 0,new SpinBoxDelegate());

Connectez-vous ou Inscrivez-vous pour répondre.