QListWidget不识别来自QTest :: mouseDClick的信号

时间:2017-10-17 16:47:47

标签: qt qlistwidget qttest

我正在尝试使用QTest来测试与QListWidget的UI交互。 通过简单的单击工作进行的交互工作正常(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 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);
}

我手动检查了对话框,并按预期调用了插槽。

1 个答案:

答案 0 :(得分:0)

我知道这是一个古老的话题,但是我在QTreeView上遇到了相同的行为,并且已经花了几个小时才能找到解决方法,所以我认为它对其他人可能很有用。

使用QTest,信号doubleClicked不会由于我不了解的Qt源代码中的一部分代码而发出(qtreeview.cpp,第1934行带有Qt 5.12.1,对于其他人,则在qabstractitemview中。) cpp line 1952)。我不知道这是否是错误。

为避免出现此奇怪的代码,我只是在使用相同参数调用QTest::mouseClick之前添加了对QTest::mouseDClick的调用。 之所以对我有用,是因为我的QTreeView只需单击一下就没有什么特别之处,但在另一种情况下却可以使测试失真。

如果有人有更好的解决方案,我会接受!