连接 QPushButton Jambi

3

我对Java编程还比较陌生。我写了下面列出的应用程序,但是我无法将按钮与我的函数连接起来。您有什么想法我做错了什么吗?

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");
    }

}

当我像这样调用函数SumNum(5,3);时,它完美地工作,但是当我从按钮中调用它时,它不起作用。我正在使用new_action.released.connect("Tata()"); 我查看了Qt文档,它给出了
void com.trolltech.qt.QSignalEmitter.AbstractSignal.connect(Object receiver, String method)但是Object receiver是什么?
我甚至将自身作为对象接收器:new_action.released.connect(new_action,"Tata()");但是它也没有起作用。
有什么想法吗? 编辑:这里是相同应用程序的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()

在Python中,它不需要对象接收器,只需运行即可,但在Java中,情况似乎完全不同。


1
Qt旨在在事件循环内使用,因此可能是问题所在。通过事件循环,我指的是在此处由execStatic()启动的循环。实现这一点的简单方法是子类化QWidget并将其用作mainWidget。因此仍将存在mainWidget.show()QApplication.execStatic(),但所有其他应用程序代码都在应用程序内部。 - Smar
@Smar 我编辑了我的问题,添加了Python示例,正如你所说,我必须制作一个单独的类并从主类执行它,就像Python示例中一样,对吗?还有接收对象是什么?那是干什么用的? - Bear
我看到你成功解决了问题 :) 还有什么未解决的问题吗?如果没有,请在您能够时接受您的答案 :) - Smar
@Smar 没错,感谢你的帮助,我相信以后还会有更多问题需要问。:D (同时我还要等待21小时才能接受我的答案) - Bear
1个回答

1

正如Smar所说,它需要在循环中运行,因此我从QWidget扩展,初始化设置在Application()中,设置布局在initUI()中,并在main()中运行。

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();
    }
}

由于我继承自QWidget,因此我只需要设置布局,如下所示:QHBoxLayout main_layout = new QHBoxLayout(this); 注意this
以及连接按钮new_action.released.connect(this,"Tata()"); 对象接收器是QWidget的当前对象,也就是说是this

这与Python完全相同,只是Python使用self而Java使用this

对我有用,希望能帮到遇到相同问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接