Bonjour,

Alors j'ai essayé de cibler le problème au maximum. Je "fabrique" des boutons à partir d'un fichier d'initialisation, dans ma classe MainWindow, sous la forme d'un tableau de taille indéfinie (à la déclaration) que j'instancie dans le constructeur.

Voici le code épuré au maximum :

mainwindow.h
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QSettings>
#include <QXmlStreamReader>
#include <QPushButton>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
    public:
        MainWindow();
 
    private:
        QSettings *settings;
 
        QWidget *centralWidget;
 
        QWidget *containerbtn;
        int NbTabsMax;
        QPushButton *btn;
 
    private slots:
        void initStyleSheet();
        void on_btnn_pressed();
};
 
#endif // MAINWINDOW_H

mainwindow.cpp
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "mainwindow.h"
#include <QDebug>
 
MainWindow::MainWindow()
{
 
    if (objectName().isEmpty())
        setObjectName(QString::fromUtf8("MainWindow"));
    setFixedSize(800, 480);
 
    settings = new QSettings("config.xml", QSettings::defaultFormat());
 
    /* BOUTONS */
    containerbtn = new QWidget(centralWidget);
    containerbtn->setObjectName(QString::fromUtf8("containerbtn"));
    containerbtn->setGeometry(QRect(700, 80, 100, 400));
    containerbtn->hide();
 
    NbTabsMax = settings->value("NbTabsMax").toInt();
    QPushButton btn[NbTabsMax];
    int x = 3;
    for(int i = 0; i < NbTabsMax; i++) {
        btn[i].setParent(containerbtn);
        btn[i].setObjectName(QString::fromUtf8(QString("btn" + QString::number(i)).toStdString().c_str()));
        btn[i].setGeometry(QRect(10, x, 81, 60));
        btn[i].setText(tr(settings->value("Tab" + QString::number(i) + "/Label","").toString().toStdString().c_str()));
        btn[i].setCheckable(true);
        x += 66;
    }
 
    // bouton créé juste pour cerner mieux le problème
    QPushButton *btnn = new QPushButton(containerbtn);
    btnn->setObjectName(QString::fromUtf8("btnn"));
    btnn->setGeometry(QRect(10, 10, 81, 60));
    btnn->setText(tr("test"));
    btnn->setCheckable(true);
 
    qDebug() << containerbtn->children();
 
    setCentralWidget(centralWidget);
 
    initStyleSheet();
    containerbtn->setStyleSheet("background-color: blue");
    containerbtn->show();
    btn[0].show();
    QMetaObject::connectSlotsByName(this);
}
 
void MainWindow::initStyleSheet()
{
    qDebug() << containerbtn->children();
}
 
void MainWindow::on_btnn_pressed()
{
    qDebug() << containerbtn->children();
}

Résultat :

Citation Envoyé par Exécution
(QPushButton(0x22f9e0, name = "btn0") , QPushButton(0x22f9f4, name = "btn1") , QPushButton(0x22fa08, name = "btn2") , QPushButton(0x22fa1c, name = "btn3") , QPushButton(0x22fa30, name = "btn4") , QPushButton(0x22fa44, name = "btn5") , QPushButton(0xb217bf0, name = "btnn") )
(QPushButton(0x22f9e0, name = "btn0") , QPushButton(0x22f9f4, name = "btn1") , QPushButton(0x22fa08, name = "btn2") , QPushButton(0x22fa1c, name = "btn3") , QPushButton(0x22fa30, name = "btn4") , QPushButton(0x22fa44, name = "btn5") , QPushButton(0xb217bf0, name = "btnn") )
Citation Envoyé par Appui sur btnn
(QPushButton(0xb217bf0, name = "btnn") )
Les boutons sont créés comme il faut (le problème ne vient pas de la méthode de configuration avec le XML, j'ai vérifié le contenu des attributs d'un bouton). Quelle que soit la fonction on_<object>_<signal_object>, j'ai le même résultat.



--------------------------------------------------------------------



Je rajoute, si ça peut aider, qu'en réalité je n'utilise pas des QPushButton mais une classe héritée (pour faire des boutons clignotants), qui comporte un QTimer en plus. Pour cela, j'ai redéfini la méthode setParent comme suit :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
void BlinkButton::setParent(QWidget *parent) {
    QPushButton::setParent(parent);
    blinking->setParent(parent);
}
A ce moment là, j'obtiens :
Citation Envoyé par Exécution
(BlinkButton(0x22f9d0, name = "btn0") , QTimer(0xb2172f0) , BlinkButton(0x22f9e8, name = "btn1") , QTimer(0xb2175b8) , BlinkButton(0x22fa00, name = "btn2") , QTimer(0xb2178a0) , BlinkButton(0x22fa18, name = "btn3") , QTimer(0xb217b88) , BlinkButton(0x22fa30, name = "btn4") , QTimer(0xb217e38) , BlinkButton(0x22fa48, name = "btn5") , QTimer(0xb218118) , BlinkButton(0xb2182f0, name = "btnn") , QTimer(0xb218a10) )
(BlinkButton(0x22f9d0, name = "btn0") , QTimer(0xb2172f0) , BlinkButton(0x22f9e8, name = "btn1") , QTimer(0xb2175b8) , BlinkButton(0x22fa00, name = "btn2") , QTimer(0xb2178a0) , BlinkButton(0x22fa18, name = "btn3") , QTimer(0xb217b88) , BlinkButton(0x22fa30, name = "btn4") , QTimer(0xb217e38) , BlinkButton(0x22fa48, name = "btn5") , QTimer(0xb218118) , BlinkButton(0xb2182f0, name = "btnn") , QTimer(0xb218a10) )
Citation Envoyé par Appui sur btnn
(QTimer(0xb2172f0) , QTimer(0xb2175b8) , QTimer(0xb2178a0) , QTimer(0xb217b88) , QTimer(0xb217e38) , QTimer(0xb218118) , BlinkButton(0xb2182f0, name = "btnn") , QTimer(0xb218a10) )


Une idée ?