我希望通过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
{}
答案 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没有跟踪它们,因为对象可以在多个线程中使用,跟踪它们的开销会不必要地高。
因此,您可以搜索从QApp.allWidgets()
及其所有孩子获得的所有小部件。您还可以查看您有权访问的对象的子项。但是如果给定的对象是无父对象的,或者不是由小部件拥有,那么你就不会那样找到它。