仅通过对象名在QApplication中查找项目

时间:2016-12-07 07:03:50

标签: python qt pyqt teamspeak pythonqt

我希望通过QApplication

中的对象名字符串名称找到任何对象

这样的东西
(function () {

var app = angular.module("angularApp", ["ngRoute"]);

app.config(function ($routeProvider) {
    $routeProvider            
        .when("/login", {
            templateUrl: "/views/login.html",
            controller: "Controller"
        })
        .when("/info", {
            templateUrl: "/views/info.html",
            controller: "infoController"
        })
        .otherwise({ redirectTo: "/home" });
});

}());

应返回带有此类名称的小部件列表,如果有多个

,我可以迭代
QApplication.instance().findByClassName("codeEditor")

我已阅读this,但它需要一个对象,我需要[QPushButton (QPushButton at: 0x0000008EA3B3DD80), QWidget (QWidget at: 0x0000008EA3F33F40)]

之类的内容

这是我想出来测试的内容:

*

它甚至找不到' InfoFrame'这显然是:

def findWidget(name):
    name = name.lower()
    widgets = self.topLevelWidgets()
    widgets = widgets + self.allWidgets()
    ret = dict()
    c = 0
    for x in widgets:
        c += 1
        if name in x.objectName.lower() or name in str(x.__class__).lower():
            ret["class:"+str(x.__class__)+str(c)] = "obj:"+x.objectName;continue
        if hasattr(x, "text"):
            if name in x.text.lower():
                ret["class:"+str(x.__class__)+str(c)] = "obj:"+x.objectName
    return ret

{}

enter image description here

3 个答案:

答案 0 :(得分:1)

我想出了这个非常好的

def getWidgetByClassName(name):
    widgets = QApplication.instance().topLevelWidgets()
    widgets = widgets + QApplication.instance().allWidgets()
    for x in widgets:
        if name in str(x.__class__).replace("<class '","").replace("'>",""):
            return x
def getWidgetByObjectName(name):
    widgets = QApplication.instance().topLevelWidgets()
    widgets = widgets + QApplication.instance().allWidgets()
    for x in widgets:
        if str(x.objectName) == name:
            return x
def getObjects(name, cls=True):
    import gc
    objects = []
    for obj in gc.get_objects():
        if (isinstance(obj, PythonQt.private.QObject) and
            ((cls and obj.inherits(name)) or
             (not cls and obj.objectName() == name))):
            objects.append(obj)
    return objects

答案 1 :(得分:1)

在Python中,可以使用gc module对任何类进行此操作。它提供了一种检索垃圾收集器跟踪的所有对象的引用的方法。这显然是一种效率很低的方法,但它(几乎)确保可以找到任何类型的对象。

这是一个通过class-name或object-name获取所有QObject实例列表的函数:

def getObjects(name, cls=True):
    objects = []
    for obj in gc.get_objects():
        if (isinstance(obj, QtCore.QObject) and
            ((cls and obj.inherits(name)) or
             (not cls and obj.objectName() == name))):
            objects.append(obj)
    return objects

这只是一个真正的调试工具 - 对于大型应用程序,很容易有数十万个对象需要检查。

如果您只需要QWidget子类的对象,请使用此函数:

def getWidgets(name, cls=True):
    widgets = []
    for widget in QtGui.QApplication.allWidgets():
        if ((cls and widget.inherits(name)) or
            (not cls and widget.objectName() == name)):
            widgets.append(widget)
    return widgets

答案 2 :(得分:0)

通常无法找到所有QObject个实例。 Qt没有跟踪它们,因为对象可以在多个线程中使用,跟踪它们的开销会不必要地高。

但是,Qt会跟踪所有小部件,因为小部件只能存在于主线程中,并且它们是相当重的对象,因此跟踪它们的开销相对较小。

因此,您可以搜索从QApp.allWidgets()及其所有孩子获得的所有小部件。您还可以查看您有权访问的对象的子项。但是如果给定的对象是无父对象的,或者不是由小部件拥有,那么你就不会那样找到它。