2013-05-14 22 views
7

Sto provando a simulare un clic del mouse su un oggetto QMenu da una QMenuBar, ad esempio cliccando su "Salva come" QAction usando il framework QTestLib.Test dell'interfaccia utente Qt: come simulare un clic su un oggetto QMenuBar utilizzando QTest?

Sono triyng questo sotto Windows XP 32 bit e Qt 5.0.2.

Qualsiasi idea?

+0

Cosa otterrebbe? Basta chiamare 'QAction :: trigger()'. – cmannett85

+0

Sto provando a creare un'applicazione di test automatizzata per un'interfaccia utente. –

+0

Questo è fondamentalmente quello che voglio fare anche io. Penso che la complicazione qui sia che QMenu non crea un widget per ogni QAction: le voci del menu sono praticamente disegnate direttamente nel rettangolo del menu. – fatuhoku

risposta

-1

È necessario utilizzare la funzione QTest::mouseClick. Simulerà il clic su qualsiasi QWidget. Ho trovato che cercare di cliccare su un QMenu che causa una chiamata bloccante non funzionerà con un test unitario.

+2

Non è una buona risposta perché il problema è la possibilità di simulare un clic specificamente su un elemento, "Salva con nome ...", di un menu. Anche se è possibile simulare un clic sul pulsante di menu "File", viene visualizzato il menu, da qualche parte nel rettangolo del menu è la parte "Salva come ..." ma come si fa a simulare un clic su di esso? Non c'è un widget figlio per accedere (o c'è?). – user405

+0

Questa risposta è sbagliata. Perché la domanda richiede un click su un QAction. Ma QAction non eredita da QWidget. Quindi questa soluzione è totalmente falsa. – LAL

5

Probabilmente questa domanda non è rilevante per il proprietario della domanda, ma suppongo che potrebbe essere utile per gli altri.

A differenza di QToolBar, QMenu non ha il metodo widgetForAction. Ho trovato una soluzione semplice per questo caso. Prova il menu popup con QTest::mouseClick se non succede nulla prova a usare QTest::keyClick(..., first_char_in_menu_tite, Qt::AltModifier). Per simulare l'esecuzione dell'azione, è possibile navigare con Qt::Key_Down fino all'azione, quindi premere Qt::Key_Enter. Suppongo che il seguente codice possa aiutarti a capire

QMenu *menu = getMenu(mainWindow, menuName); 
if (menu != nullptr) { 
    QTest::keyClick(mainWindow, menu->title().at(1).toLatin1(), Qt::AltModifier); 
} 


QList<QAction *> actions = menu->actions(); 
foreach (QAction *action, actions) { 
    if (action->objectName() == actionName) { 
     QTest::keyClick(menu, Qt::Key_Enter); 
     break; 
    } 
    QTest::qWait(1000); 
    QTest::keyClick(menu, Qt::Key_Down); 
} 
+0

Ho fatto un esempio simile ma per QComboBox qui. Grazie per aver postato QMenu! https://gist.github.com/peteristhegreat/cbd8eaa0e565d0b82dbfb5c7fdc61c8d – phyatt