2016-08-09 54 views
1

我有2個問題:如何使用Qt測試控制QFileDialog?

  1. 如何訪問一個QFileDialog和寫入文件的路徑中使用Qt測試模塊的「文件名」欄中?

    我在問,因爲我正在開發一些Qt中的GUI測試,現在我需要打開一個文本文件。下面的代碼創建的QFileDialog及獲取文件的路徑:

    QString filePath = QFileDialog::getOpenFileName(
              this, 
              "Open", 
              "", 
              tr("Text Files (*.txt)")); 
    
  2. 如果我使用一個線程(QThread)加載在這個文本文件中的內容,我怎麼能等待這個線程在我的GUI完成測試?

    我知道我可以使用QTest::qSleep(milliseconds);命令,但我認爲在這種情況下這不是一個好習慣。

如果可能請給我一個例子。

+0

您的意思是Qt測試模塊,對吧? –

+0

是的,Qt測試模塊。 – KelvinS

回答

1
  1. 不幸的是,使用Qt測試模塊是不可能的。您有幾種選擇:

    1. 添加測試分支繞過該對話框:你需要你的儀器代碼,使其可測試。你可以例如在要求將文件請求到文件路徑的對象上設置testFile屬性,如果該屬性被設置,則該對象可以跳過詢問該文件。

      const char k_testFile[] = "k_testFile"; 
      
      MyClass::foo() { 
          ... 
          auto testFile = property(k_testFile); 
          auto filePath = testFile.isNull() 
          ? QFileDialog::getOpenFilePath(...) 
          : testFile.toString(); 
          ... 
      } 
      
    2. 使用非本地對話框,然後它是一個正常的小工具,可以測試使用Qt測試。

    3. 使用特定於平臺的方法來查找本機對話框並與之交互。您需要爲每個想要測試的平臺實施它。

  2. 你應該在文件加載後發出信號。測試可以等待那個信號。你甚至都不需要使用一個明確的線程加載文件,異步加載文件的慣用方法是:

    QString filePath = ...; 
    QtConcurrent::run(ioPool, [this, filePath]{ 
        auto data = MyLoader::load(filePath); 
        emit haveFileData(data); 
    }); 
    

    ,你調用該代碼的類應該有一個haveFileData信號,其他一些代碼連接並根據需要進行。 ioPool是用於I/O綁定操作的線程池,如果您希望全局池成爲I/O池,則它可以是QThredPool::globalInstance()。 CPU和I/O綁定的線程池應該是分開的。

+0

謝謝,庫巴。 1.我不知道什麼是「測試鉤子」,但我會搜索它。 2.這不是我現在項目的選項。 :/ 3.我不太明白這個選項。我正在開發使用Windows平臺,但該應用程序是多平臺的,那麼,我認爲這對我來說不是一個有效的選擇。 – KelvinS

+0

Re 3.您需要在每個測試平臺上添加操作平臺對話框的測試鉤子。在Windows和OS X上它會相對容易。在Linux上,「本機」對話框可能是Qt對話框,KDE對話框或Gnome對話框,這會更困難。 –

+0

其實,我只是需要它的Windows和OS X,然後,也許這個選項是一個可能的解決方案。 – KelvinS