QListWidget 无法识别来自 QTest::mouseDClick 的信号
QListWidget doesn't recognize signals from QTest::mouseDClick
我正在尝试使用 QTest 来测试 UI 与 QListWidget 的交互。
通过简单的点击进行的交互工作正常(QTest::mouseClick()),但通过双击进行的交互则不能(QTest::mouseDClick())。
这里是重现问题的简化代码示例:
Dialog.h
class UILIBSHARED_EXPORT Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
int doubleClickCount = 0;
QString lastItemClicked = "";
QListWidget* GetListW();
private slots:
void on_listWidget_doubleClicked(const QModelIndex &index);
public:
Ui::Dialog *ui;
};
Dialog.cpp
QListWidget*Dialog::GetListW()
{
return ui->listWidget;
}
void Dialog::on_listWidget_doubleClicked(const QModelIndex &index)
{
lastItemClicked = ui->listWidget->item(index.row())->text();
++doubleClickCount;
}
测试 class :
class DoubleClickTest : public QObject
{
Q_OBJECT
public:
DoubleClickTest();
private Q_SLOTS:
void testDoubleClick();
};
void DoubleClickTest::testDoubleClick()
{
Dialog dialog;
dialog.show();
QListWidgetItem* item = dialog.GetListW()->item(1);
QRect rect = dialog.GetListW()->visualItemRect(item);
QTest::mouseDClick(dialog.GetListW()->viewport(), Qt::LeftButton, Qt::KeyboardModifiers(), rect.center());
QCOMPARE(dialog.doubleClickCount, 1);
}
我手动检查了对话框,插槽按预期被调用。
我知道这是一个老话题,但我遇到了与 QTreeView 相同的行为,并且花了几个小时找到解决方法,所以我认为它对其他人有用。
使用 QTest,信号 doubleClicked
永远不会发出,因为我不理解 Qt 源代码中的一部分代码(qtreeview.cpp,第 1934 行与 Qt 5.12.1,或其他,在 qabstractitemview.cpp 行 1952 中)。不知道是不是bug
为了避免这个奇怪的代码,我只是在使用相同参数调用 QTest::mouseDClick
之前添加了对 QTest::mouseClick
的调用。
它对我有用,因为我的 QTreeView 在简单的点击中没有做任何特别的事情,但在另一种情况下它可能会扭曲测试。
如果有人有更好的解决方案,我采纳!
我正在尝试使用 QTest 来测试 UI 与 QListWidget 的交互。 通过简单的点击进行的交互工作正常(QTest::mouseClick()),但通过双击进行的交互则不能(QTest::mouseDClick())。
这里是重现问题的简化代码示例:
Dialog.h
class UILIBSHARED_EXPORT Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
int doubleClickCount = 0;
QString lastItemClicked = "";
QListWidget* GetListW();
private slots:
void on_listWidget_doubleClicked(const QModelIndex &index);
public:
Ui::Dialog *ui;
};
Dialog.cpp
QListWidget*Dialog::GetListW()
{
return ui->listWidget;
}
void Dialog::on_listWidget_doubleClicked(const QModelIndex &index)
{
lastItemClicked = ui->listWidget->item(index.row())->text();
++doubleClickCount;
}
测试 class :
class DoubleClickTest : public QObject
{
Q_OBJECT
public:
DoubleClickTest();
private Q_SLOTS:
void testDoubleClick();
};
void DoubleClickTest::testDoubleClick()
{
Dialog dialog;
dialog.show();
QListWidgetItem* item = dialog.GetListW()->item(1);
QRect rect = dialog.GetListW()->visualItemRect(item);
QTest::mouseDClick(dialog.GetListW()->viewport(), Qt::LeftButton, Qt::KeyboardModifiers(), rect.center());
QCOMPARE(dialog.doubleClickCount, 1);
}
我手动检查了对话框,插槽按预期被调用。
我知道这是一个老话题,但我遇到了与 QTreeView 相同的行为,并且花了几个小时找到解决方法,所以我认为它对其他人有用。
使用 QTest,信号 doubleClicked
永远不会发出,因为我不理解 Qt 源代码中的一部分代码(qtreeview.cpp,第 1934 行与 Qt 5.12.1,或其他,在 qabstractitemview.cpp 行 1952 中)。不知道是不是bug
为了避免这个奇怪的代码,我只是在使用相同参数调用 QTest::mouseDClick
之前添加了对 QTest::mouseClick
的调用。
它对我有用,因为我的 QTreeView 在简单的点击中没有做任何特别的事情,但在另一种情况下它可能会扭曲测试。
如果有人有更好的解决方案,我采纳!