【问题标题】:QListWidget doesn't recognize signals from QTest::mouseDClickQListWidget 无法识别来自 QTest::mouseDClick 的信号
【发布时间】:2019-05-06 17:34:35
【问题描述】:

我正在尝试使用 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);
}

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

【问题讨论】:

  • 你是如何连接插槽“on_listWidget_doubleClicked”的?
  • katamarayudu: 使用 on_<..>_event 时会自动连接
  • katamarayudu:是的,它是自动连接的,正如 user3606329 解释的那样。但是手动连接结果是一样的。
  • 事实上,代码甚至不适用于单击事件。我按照这里的解释修复了它:stackoverflow.com/questions/10728362/… 现在代码适用于单击,但仍然不适用于双击(这是关键问题)。

标签: qt qlistwidget qttest


【解决方案1】:

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

使用 QTest,信号 doubleClicked 永远不会发出,因为我不理解 Qt 源代码中的一部分(qtreeview.cpp,Qt 5.12.1 的第 1934 行,或者对于其他人,在 qabstractitemview.cpp 行1952)。不知道是不是bug。

为了避免这个奇怪的代码,我只是在调用QTest::mouseDClick 之前添加了一个对QTest::mouseClick 的调用,参数相同。 它对我有用,因为我的 QTreeView 在简单的点击时没有做任何特别的事情,但在另一种情况下它可能会扭曲测试。

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

【讨论】:

  • 我确认这个 hack 也适用于 Windows(不是我选择使用这个可憎的 :/)。
  • 只是为了添加一些上下文,看起来发生这种情况的原因是因为它首先检查您尝试选择的任何内容是否已启用。我真的不想继续通过源代码来确认是什么意思,但似乎单击启用它,第二次单击实际上执行了对单元格的双击,这就是为什么你需要 2 个事件
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
相关资源
最近更新 更多