Search code examples
qtpluginsida

Ida Pro and PyQt simple buttons connect


how do i connect the buttons, in a Ida Pro using a script and PyQT. this script brings two buttons up. my script.

from idaapi import PluginForm
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import QWidget
from PyQt4.QtGui import QPushButton
import sip

class MyPluginFormClass(PluginForm):
    def OnCreate(self, form):
        """
        Called when the plugin form is created
        """
        # Get parent widget
        self.parent = self.FormToPyQtWidget(form)
        self.PopulateForm()

    def PopulateForm(self):

        # Create layout

        layout = QtGui.QHBoxLayout()
        btn1 = QtGui.QPushButton('world')
        btn2 = QtGui.QPushButton('hello')
        layout.addWidget(btn1)
        layout.addWidget(btn2)

        self.parent.setLayout(layout)

    def OnClose(self, form):
        """
        Called when the plugin form is closed
        """
        pass

plg = MyPluginFormClass()
plg.Show("Buttons")

normally i would do like this to call the buttons.

btn1 = QtGui.QPushButton()
btn1.setText("Hello")
btn1.clicked.connect(self.hello)

def hello():
    print "hello"

But appenrently either setText or clicked.connect dont work inside Ida. also it looks like that i cant call QAplication via ida pro, since ida itself is a application and frezzes if called.

Any idea how to make buttons work ? Regards


Solution

  • You would have to delete the app execution to make all work and change Qapplication to Qwidget.

    here is my hello script with a little mini forum :) load in ida from either *.py or from script command be sure to have sip and Qt instal proberly This way You can disign plugins must faster and richer. and if you see i dont even import idaapi

    # -*- coding: utf-8 -*-
    #Created by michael
    
    
    
    from PyQt4 import QtCore, QtGui
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
    
    class Ui_TabWidget(object):
        def setupUi(self, TabWidget):
            TabWidget.setObjectName(_fromUtf8("TabWidget"))
            TabWidget.resize(764, 385)
            self.tab = QtGui.QWidget()
            self.tab.setObjectName(_fromUtf8("tab"))
            self.btn_hello = QtGui.QPushButton(self.tab)
            self.btn_hello.setGeometry(QtCore.QRect(30, 30, 75, 23))
            self.btn_hello.setObjectName(_fromUtf8("btn_hello"))
            self.btn_idaaaap = QtGui.QPushButton(self.tab)
            self.btn_idaaaap.setGeometry(QtCore.QRect(30, 90, 75, 23))
            self.btn_idaaaap.setObjectName(_fromUtf8("btn_idaaaap"))
            TabWidget.addTab(self.tab, _fromUtf8(""))
            self.tab1 = QtGui.QWidget()
            self.tab1.setObjectName(_fromUtf8("tab1"))
            self.verticalLayout = QtGui.QVBoxLayout(self.tab1)
            self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
            self.webView = QtWebKit.QWebView(self.tab1)
            self.webView.setUrl(QtCore.QUrl(_fromUtf8("http://stackoverflow.com/questions/24494412/ida-pro-and-pyqt-simple-buttons-connect/")))
            self.webView.setObjectName(_fromUtf8("webView"))
            self.verticalLayout.addWidget(self.webView)
            TabWidget.addTab(self.tab1, _fromUtf8(""))
    
            self.retranslateUi(TabWidget)
            TabWidget.setCurrentIndex(1)
            QtCore.QMetaObject.connectSlotsByName(TabWidget)
    
        def retranslateUi(self, TabWidget):
            TabWidget.setWindowTitle(_translate("TabWidget", "TabWidget", None))
            self.btn_hello.setText(_translate("TabWidget", "Hello World", None))
            self.btn_idaaaap.setText(_translate("TabWidget", "Help idaapi", None))
            TabWidget.setTabText(TabWidget.indexOf(self.tab), _translate("TabWidget", "test signal", None))
            TabWidget.setTabText(TabWidget.indexOf(self.tab1), _translate("TabWidget", "stackoverflow Forum", None))
            self.btn_hello.clicked.connect(self.Hello)
            self.btn_idaaaap.clicked.connect(self.Help)
    
    
        def Hello(self):
            print "what the heck how did i get in here"
    
        def Help(self):
            help("idaapi")
    
    
    
    from PyQt4 import QtWebKit
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QWidget()
        TabWidget = QtGui.QTabWidget()
        ui = Ui_TabWidget()
        ui.setupUi(TabWidget)
        TabWidget.show()