gpt4 book ai didi

c++ - 如何在 Qt 中获取指向弹出对话框的指针,这会阻塞 QTest 中的 UI 线程

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:19 25 4
gpt4 key购买 nike

我正在使用 QTest 编写集成测试,其中只要我单击小部件的视口(viewport),就会出现一个多行弹出窗口 QInputDialog,它会阻止代码的进一步执行并需要手动取消对话框。这是代码:

void PartTest::testTypewriterAnnotTool()
{
Okular::Part part(nullptr, nullptr, QVariantList()); // It is the main widget of PDF reader comprising of viewport where PDF page is shown

part.openUrl(QUrl::fromLocalFile(QStringLiteral(KDESRCDIR "data/file1.pdf"))); // open file1.pdf

part.widget()->show();
QVERIFY(QTest::qWaitForWindowExposed(part.widget()));

// Width and height of pageView widget, the child of Part widget which shows the PDF page

const int width = part.m_pageView->horizontalScrollBar()->maximum() +
part.m_pageView->viewport()->width();
const int height = part.m_pageView->verticalScrollBar()->maximum() +
part.m_pageView->viewport()->height();

part.m_document->setViewportPage(0); // sets viewport page 0, i.e. page number 1

QMetaObject::invokeMethod(part.m_pageView, "slotToggleAnnotator", Q_ARG( bool, true )); // toggles and shows the annotation toolbar with all tools avaialable

QList<QToolButton *> toolbuttonList = part.m_pageView->findChildren<QToolButton *>(); // find a list of annotation toolbutton
// Check if the tooltip of 10th button is "Typewriter"
QToolButton* typewriterButton = toolbuttonList.at(9);
QCOMPARE( typewriterButton->toolTip(), QStringLiteral("Typewriter") );

typewriterButton->click(); // clicking and selecting typewriter annotation tool

QTest::mouseMove(part.m_pageView->viewport(), QPoint(width * 0.5, height * 0.2)); // leading mouse pointer to a specific point in the viewport

QTest::mouseClick(part.m_pageView->viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(width * 0.5, height * 0.2)); // mouse left button click on the viewport and a popup dialog with 'add a new note' appears

}

我必须编写一个测试用例,我必须在其中获取弹出对话框并以编程方式将其关闭。我试图通过使用 QTimer 来实现这一点,我将在其中执行一个函数以在单击视口(viewport) 1 秒后获取对话框,然后尝试像这样关闭它:

class PartTest
{
...
private:
Okular::part *m_part;
}

void PartTest::testTypewriterAnnotTool()
{
...
m_part = &part;
QTimer* mTimer = new QTimer(this);
mTimer->setSingleShot(true);
connect(mTimer, SIGNAL(timeout()), SLOT(testDialogClosed()));
mTimer->start(1000);
QTest::mouseClick(part.m_pageView->viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(width * 0.5, height * 0.2));
}

void PartTest::testDialogClosed()
{
bool m_clicked = false;
QDialog *dialog = m_part->widget()->findChild<QDialog*>();
if (dialog)
{
QDialogButtonBox *buttonBox = dialog->findChild<QDialogButtonBox*>();
buttonBox->button(QDialogButtonBox::Cancel)->click();
m_clicked = true;
}
QVERIFY(m_clicked);
}

在这里,QVERIFY(m_clicked) 测试用例总是“失败”,这意味着弹出窗口 QInputDialog 不是 Okular::Part 的子级 并且我没有得到获取指向此对话框窗口的指针并关闭它的方法。有帮助吗?

最佳答案

你可以枚举top-level widgets并以这种方式找到对话框:

template <class P> QList<P> topLevelWidgets() {
QList<P> widgets
for (auto *w : QApplication::topLevelWidgets())
if (auto *t = qobject_cast<P>(w))
widgets << t;
return widgets;
}

template <class P> P topLevelWidget() {
auto w = topLevelWidgets<P>();
return (w.size() == 1) ? w.first() : nullptr;
}

void PartTest::testDialogClosed()
{
bool m_clicked = false;
if (auto *dialog = topLevelWidget<QDialog*>())
if (auto *buttonBox = dialog->findChild<QDialogButtonBox*>()) {
buttonBox->button(QDialogButtonBox::Cancel)->click();
m_clicked = true;
}
QVERIFY(m_clicked);
}

关于c++ - 如何在 Qt 中获取指向弹出对话框的指针,这会阻塞 QTest 中的 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com