self.toolbar = self.addToolBar('var')
尽管在这种情况下,“自我”是一个窗口,但我认为我需要引用IDA的主窗口。有人知道我如何获得该参考吗?
#1 楼
新的IDA 6.95 API也许是因为他们看到了这个问题,也许是由于用户请求,所以发布了6.95版,其中包含两个用于创建菜单和工具栏的IDAPython API函数:
create_menu
和create_toolbar
,所以现在可以旧技巧-在6.95之前我一直使用的一个技巧是手动找到应用程序的主窗口,然后直接使用QT添加工具栏。 IDA只有一个主窗口。
添加一个工具栏,据我所知,IDA可以完全识别该工具栏。您可以选择打开和关闭它,也可以停靠和取消停靠,更改为高级模式也会自动显示它。但是,IDA不允许您在IDA 6.7及更高版本中向其添加操作(如hexblog.com/?p=886中所述)。
示例代码如下所示:
for widget in QtGui.qApp.topLevelWidgets():
if type(widget) == QtGui.QMainWindow:
mainWindow = widget
toolbar = mainWindow.addToolBar("My toolbar")
# and now for adding stuff to our toolbar
toolbar.addSeparator()
toolbar.addWidget(...)
免责声明:请记住,如果这样做有风险,无记录且可能无法始终有效,请以这种方式查找主窗口。 IDA可能不喜欢您要更改其下面的内容。我确实使用了它,但是它可以正常工作,但是YMMV和UAYOR起作用。加载插件时可见,您
可能想要在查找主窗口时设置QTimer。
由于未记录,我使用了更多方法来查找主窗口。使用
qApp.activeWindow()
和/或qApp.focusWidget()
并遍历其.parent()
是不错的选择。编辑:从IDA插件中处理不同的加载模式并在IDA应用程序尚未完全设置的情况下重新键入:
def init(self):
self.setup()
return idaapi.PLUGIN_KEEP
def setup(self):
if not self.get_mainwindow():
self.delay_setup()
return
# Add a toolbar like OP requested
self.toolbar = self.get_mainwindow().addToolBar("My toolbar")
self.toolbar.setIconSize(QtCore.QSize(16, 16))
# Bonus: add a menue
self.menu = QtGui.QMenu("My menu")
self.get_mainwindow().menuWidget().addMenu(self.menu)
def delay_setup(self):
QtCore.QTimer.singleShot(1000, self.setup)
def get_mainwindow(self):
if self.mainwindow:
return self.mainwindow
app = QtGui.qApp
widgets = [app.focusWidget(), app.activeWindow()] + app.topLevelWidgets()
mainwidgets = filter(None, map(self.search_mainwindow, widgets))
if mainwidgets:
self.mainwindow = mainwidgets[0]
return self.mainwindow
def search_mainwindow(self, widget):
while widget != None:
if isinstance(widget, QtGui.QMainWindow):
return widget
widget = widget.parent()
return None
评论
不是解决方案,而只是为了完整性:在IDA 6.7 +中,它们对此进行了重大改进:hexblog.com/?p=886是的,我已经看到了,但是对于6.4并没有帮助,但是谢谢。通过构建一个我可以停靠的视图,我已经获得了大多数我需要的功能,它不如工具栏那么好,但是可以使用。