2017-12-04 1 views
0

Ich habe ein neues QML-Projekt basierend auf Qt 5.9.3 erstellt. Ich habe ein einfaches ApplicationWindow mit einem Button und meinem eigenen Button (MyButton) eingerichtet und ich bekomme nie das onClicked() -Ereignis, um (anscheinend) für beide zu feuern. Mein Anwendungsfenster wird mit 2 Schaltflächen angezeigt. Wenn Sie auf einen der beiden klicken, wird in der Konsolenausgabe nichts angezeigt.qml Button nicht feuernd, gleich mit MouseArea

Ich kompiliere auch meine QML-Quelldateien in der .pro-Datei, wenn das überhaupt zählt. Ich bekomme einige Font-Fehler beim Start, die ich in C++ zu beheben einige Schriftarten gehen, so dass ich etwas sehen kann, außer dass es keine Fehler oder Warnungen gibt. Ich habe ein paar Stunden damit verbracht, einfach ein einfaches Mausklick Ereignis durch ohne Glück zu bekommen.

Jede Hilfe wird geschätzt.

Hier ist meine main.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.0 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: "App Title" 
    color: "white" 

    Button { 
     text: "Button" 
     onClicked: { 
      console.log("clicked") 
     } 
    } 
    MyButton { 
     anchors.right: parent.right 
     anchors.top: parent.top 
     onClicked: { 
      console.log("my button clicked") 
     } 
    } 
} 

und MyButton.qml

import QtQuick 2.7 

Rectangle { 
    id: button 
    width: 100 
    height: 50 
    color: "yellow" 

    signal clicked() 

    MouseArea { 
     id: mouseArea 
     anchors.fill: button 
     visible: false 
     enabled: true 
     onClicked: { 
      console.log("my button mouse clicked") 
      clicked() 
     } 
    } 
} 

UPDATE: Ich habe eine sehr dumme Sache tat. in meiner main.cpp Datei, die ich nicht eingeschlossen habe, dachte ich, dass ich sauberer sein würde und meinen QQmlEngine Init-Code in seine eigene getrennte Methode verschiebe. Natürlich, wenn die Motorreferenz out of scope ging, verursachte es mein Problem. Ich habe dort nicht nachgesehen, weil ich zu Unrecht angenommen hatte, dass der qml-Code überhaupt nicht funktionieren würde, wenn da etwas nicht stimmte. Es tut mir leid, dass ich so spät wieder hier war, es war eine sehr arbeitsreiche Woche und es tut mir leid, Bandbreite zu verschwenden. Vielen Dank für die tollen Debugging-Vorschläge sowie für zukünftige Referenz!

Antwort

1

Ich weiß nicht über Ihr Problem mit der Button von QtQuick.Controls 2.0 - es funktioniert perfekt für mich.

Mit Ihrer eigenen Implementierung der MyButton, das funktioniert auch nicht für mich.

Der Grund ist, dass visible: false die MouseArea (und alle Kinder davon) deaktiviert - Einstellung enabled: true wird das nicht ändern.
Einstellung visible: false ist sowieso unnötig, da eine MouseArea nichts zu rendern hat - effektiv unsichtbar.

Sobald Sie geändert haben, dass Sie eine Warnung erhalten sollte:

Error: Insufficient arguments

wie Sie clicked des MouseArea das Signal nennen, die ein Argument erfordert (MouseEvent). Um Ihren selbst definierten Signal zu rufen, rufen button.clicked() instead.R


Wenn Sie noch nicht anyting bekommen, müssen Sie eine weitere Debugging-Schritte unternehmen.

  1. Überprüfen Sie, ob Sie einen beliebigen Ausgangs console.log zum Beispiel erzeugen kann durch Zugabe von Component.onComplete: console.log("Output works") zu einem Ihrer Objekte verwenden.

  2. Überprüfen Sie, ob Ihre Eingaben wirklich defekt ist, durch die Farbe des Rectangle ändern, wenn das MouseArea geklickt wird: color: (mouseArea.pressed ? 'red' : 'green')

  3. eine eventFilter installieren, um Ihre QGuiApplication (in C++), die etwas gedruckt wird, wenn ein MouseEvent ist eingetragen.