2016-04-19 8 views
3

Ich bin ziemlich neu in Java-Programmierung. Ich habe die folgende Anwendung geschrieben, aber ich kann die Taste nicht mit meiner Funktion verbinden. Irgendeine Idee, was ich falsch mache?Verbinden QPushButton Jambi

package com.teat; 
import com.trolltech.qt.gui.*; 

public class Application 
{ 

    public static void main(String[] args) 
    { 
     QApplication.initialize(args); 
     QWidget mainWidget = new QWidget(); 
     mainWidget.setWindowTitle("Simple Example"); 
     QHBoxLayout main_layout = new QHBoxLayout(); 
     mainWidget.setLayout(main_layout); 

     QPushButton new_action = new QPushButton("Working"); 
     new_action.released.connect("Tata()"); 
     main_layout.addWidget(new_action); 

     SumNum(5,3); 
     mainWidget.show(); 
     QApplication.execStatic(); 
     QApplication.shutdown(); 
    } 

    private static int SumNum(int num1,int num2) 
    { 
     int sum = num1 + num2; 
     System.out.println(sum); 
     return sum; 

    } 
    private static void Tata(){ 
     System.out.println("Yes, it's Working"); 
    } 

} 

Wenn ich die Funktion wie SumNum(5,3); nennen es perfekt funktioniert, aber wenn ich es aus Taste aufrufen, Es funktioniert nicht. Ich verwende new_action.released.connect("Tata()");

ich in Qt haben gesucht, es gibt mir
void com.trolltech.qt.QSignalEmitter.AbstractSignal.connect(Object receiver, String method) aber was ist Object-Empfänger?

Ich gebe sogar selbst als Objekt Empfänger, new_action.released.connect(new_action,"Tata()");, aber, nein, es hat auch nicht funktioniert.

Irgendeine Idee?

Edit: hier die gleiche Anwendung in Python:

import sys 
from PyQt4 import QtGui, QtCore 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.setWindowTitle('Simple Example') 

     main_layout = QtGui.QHBoxLayout() 
     self.setLayout(main_layout) 

     new_action = QtGui.QPushButton("Working") 
     new_action.released.connect(self.Tata) 
     main_layout.addWidget(new_action) 

     self.show() 

    def SumNum(self, num1, num2): 
     print num1+num2 
     return num1+num2 

    def Tata(self): 
     print "Yes, it's Working" 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

in Python nicht für Objekt Empfänger gefragt hat, und es führt Sie es einfach, aber in Java wie es scheint, ganz anders.

+1

Qt soll innerhalb der Ereignisschleife verwendet werden, so dass das Problem auftreten kann. Mit Ereignisschleife meine ich die Schleife, die von 'execStatic()' hier gestartet wird. Eine einfache Möglichkeit, dies zu tun, ist, die Klasse QWidget zu unterteilen und sie als 'mainWidget' zu verwenden. So wird es 'mainWidget.show()' und 'QApplication.execStatic()' immer noch geben, aber der ganze andere Anwendungscode ist in der Anwendung. – Smar

+0

@Smar Ich habe meine Frage bearbeitet, hinzugefügt Python Beispiel, wie Sie gesagt haben, ich muss separate Klasse machen und führen Sie es aus der Hauptklasse, genau wie es ist in Python Beispiel, richtig? Und was ist mit einem Objektempfänger? Wofür ist das? – Bear

+0

Ich sehe, du hast es geschafft, dein Problem zu lösen :) Gibt es noch offene Fragen? Wenn nicht, bitte akzeptiere einfach deine Antwort, nachdem du dazu in der Lage bist :) – Smar

Antwort

1

wie das, was die Smar es erforderlich in einer Schleife laufen, so dass ich erstrecken sich von QWidget, in Application() die Einstellungen der erstmaligen Einrichtung des Layouts in initUI() und es in main() laufen.

import com.trolltech.qt.core.*; 
import com.trolltech.qt.gui.*; 

public class Application extends QWidget { 

    public Application() { 

     setWindowTitle("Simple Example"); 
     setMinimumHeight(100); 
     setMinimumWidth(100); 
     setGeometry(250, 250, 350, 100); 

     initUI(); 

     show(); 
    } 

    private void initUI() { 

     QHBoxLayout main_layout = new QHBoxLayout(this); 

     QPushButton new_action = new QPushButton("Working"); 
     new_action.released.connect(this,"Tata()"); 
     main_layout.addWidget(new_action); 

    } 

    private void Tata(){ 
     System.out.println("Yes, it's Working"); 
    } 

    public static void main(String[] args) { 
     QApplication.initialize(args); 
     new Application(); 
     QApplication.execStatic(); 
     QApplication.shutdown(); 
    } 
} 

, da ich von QWidget verlängert, ich brauche nur das Layout einstellen wie so QHBoxLayout main_layout = new QHBoxLayout(this); Beachten Sie die diese
sowie die Schaltfläche new_action.released.connect(this,"Tata()"); Objekt Empfänger verbindet, ist dieser oder in einem anderen Wortstrom QWidget

es ist genau das gleiche wie Python, nur Python verwenden self und Java verwenden this.

das ist, was für mich gearbeitet hat, hoffe, dass die Hilfe jedoch das gleiche Problem hat.