4

クリックできるウィンドウを PyQt に作成したいと思います。つまり、ウィンドウをクリックすると、そのクリックがパススルーされるため、ウィンドウが上に表示されたまま、その背後にあるものを操作できます。私が達成しようとしている効果の例は、デフォルトで右上隅に表示される Ubuntu の通知のようなもので、クリックすることができます。

理想的には、PyQt でこれを実行できるようにしたいと考えています。そうでない場合、私のプラットフォームは Linux ですが、Windows ソリューションも大歓迎です!

事前に助けを求めて乾杯!私はこれを少し考えて研究してきましたが、これができれば素晴らしいことです。

編集:後ろの窓にトレーシングペーパーのように使える窓を作ろうとしています

4

2 に答える 2

3

これは、PyQt4 を使用した Windows でのソリューションです。

Front ウィジェット (Windows では winEvent) の eventFilter をオーバーライドしてから、イベントを Back ウィンドウに転送する必要があります。

完全にはわかりませんが、他のプラットフォームで使用できる同様のアプローチがあるはずです (winEvent の代わりに、おそらく x11Event?)

幸運を!

from PyQt4 import QtCore, QtGui
import win32api, win32con, win32gui, win32ui

class Front(QtGui.QPushButton):
    def __init__(self,text="",whndl=None):
        super(Front,self).__init__(text)
        self.pycwnd = win32ui.CreateWindowFromHandle(whndl)

    # install an event filter for Windows' messages. Forward messages to 
    # the other HWND
    def winEvent(self,MSG):

        # forward Left button down message to the other window.  Not sure 
        # what you want to do exactly, so I'm only showing a left button click.  You could 
        if MSG.message == win32con.WM_LBUTTONDOWN or \
           MSG.message == win32con.WM_LBUTTONUP:

            print "left click in front window"
            self.pycwnd.SendMessage(MSG.message, MSG.wParam, MSG.lParam)
            return True, 0 # tells Qt to ignore the message

        return super(Front,self).winEvent(MSG)

class Back(QtGui.QPushButton):
    def __init__(self,text=""):
        super(Back,self).__init__(text)
        self.clicked.connect(self.onClick)

    def onClick(self):
        print 'back has been clicked'

def main():
    a = QtGui.QApplication([])

    back = Back("I'm in back...")
    back.setWindowTitle("I'm in back...")
    back.show()

    # Get the HWND of the window in back (You need to use the exact title of that window)
    whndl = win32gui.FindWindowEx(0, 0, None, "I'm in back...")

    # I'm just making the front button bigger so that it is obvious it is in front ...
    front = Front(text="*____________________________*",whndl=whndl)
    front.setWindowOpacity(0.8)
    front.show()    

    a.exec_()

if __name__ == "__main__":
    main()
于 2013-08-12T21:39:46.040 に答える