Je suis en train de créer un test pour un cas d'utilisation comme ceci:QTest: tester les boîtes de dialogue avec les boîtes de dialogue sous
- Une boîte de dialogue est ouvert
- En cliquant sur un bouton dans cette boîte de dialogue ouvre un sous dialogue
- en cliquant sur un bouton dans la boîte de dialogue sous le ferme
- une action se fait dans le dialogue après le sous dialogue a été fermée
j'ai pu acte judiciaire e un test qui fait tout cela et organise les dialogues pour rendre ce test possible. Cependant, un problème étrange se produit: si ces étapes sont répétées plusieurs fois, l'action finale est répétée plus de fois que nécessaire. Pour simplifier, supposons que l'action génère des données d'entrée. Voici le motif répété:
- exécuter le test avec des données "1" -> sortie est "1"
- Execute test avec des données "1 2" -> sortie est "1 2 2"
- Exécuter test avec données "1 2 3" -> sortie "1 2 2 3 3 3"
- Exécuter le test avec les données "1 2 3 4" -> la sortie est "1 2 2 3 3 3 4 4 4 4"
Il semble que le signal d'action final soit répété, mais je n'ai pas réussi à trouver ce qui ne va pas avec le code. Voici un exemple de code simplifié qui reproduit la question:
test cas
void QtBugIsolationTest::testCase1()
{
auto dialog = new MyDialog();
QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
QVERIFY(true);
}
dialogue principal
MyDialog::MyDialog()
{
setGeometry(0, 0, 100, 100);
subDialog = new MySubDialog(this);
showSubDialogButton = new QPushButton(this);
connect(showSubDialogButton, SIGNAL(clicked()), this, SLOT(OnShowSub()));
}
MyDialog::~MyDialog()
{
delete showSubDialogButton;
}
void MyDialog::OnShowSub()
{
connect(subDialog, SIGNAL(accepted()), this, SLOT(OnCloseSub()));
subDialog->show();
}
void MyDialog::OnCloseSub()
{
std::cout << "Closed sub dialog" << std::endl;
subDialog->hide();
disconnect(subDialog);//, SIGNAL(accepted()));
}
Sous dialogue
MySubDialog::MySubDialog(QWidget* parent) : QDialog(parent)
{
setGeometry(0, 0, 100, 100);
button = new QPushButton(this);
connect(button, SIGNAL(clicked()), this, SLOT(OnPush()));
auto layout = new QHBoxLayout();
layout->addWidget(button);
setLayout(layout);
}
MySubDialog::~MySubDialog()
{
delete button;
}
void MySubDialog::OnPush()
{
std::cout << "Button Pushed" << std::endl;
accepted();
}
Si demandé (et possible dans StackOverflow), je peux poster l'ensemble du projet QtCreator ou des fichiers d'en-tête pour ces classes.