Wie kann ich anklickbaren QFrame anzeigen, ohne den Fokus aus dem Hauptfenster zu verlieren?

Endlich kann ich einen erstellenChromähnliche Registerkarte in Qt / PyQt QMainWindow. Nach dem erfolglosen Versuch, dies zu portierenQt C ++ Nicht-Client-Bereich MalcodeIch überarbeite mein Denken so: Trick visuell durch Anzeigen eines Free FloatingQFrame Die Größe wird geändert und zusammen mit dem Hauptfenster verschoben. Dies ist sicherlich keine perfekte Lösung (zum Beispiel lässt sich mit diesem Code immer noch nicht lösen, wann der oberste Hinweis deaktiviert werden soll, wenn sich eine andere Anwendung über dem Hauptanwendungsfenster befindet, aber ich denke, dass dies recht einfach zu lösen ist.)

Was ich auf dieser Seite fragen möchte, ist, wie man die Klickaktion auf diese hältQFrame Fenstertaste, um den Fokus vom Hauptfenster zu stehlen? Momentan reaktiviere ich einfach das Hauptfenster, wenn eine Klickaktion stattfindet. Aber es erzeugt einen blinkenden Effekt in der Hauptfenster-Titelleiste. Ich glaubeDiese SO-Seite gibt die AntwortIch konnte mit diesem C ++ - Code jedoch kein erfolgreiches Ergebnis erzielen:

HWND winHandle = (HWND)winId();
ShowWindow(winHandle, SW_HIDE);
SetWindowLong(winHandle, GWL_EXSTYLE, GetWindowLong(winHandle, GWL_EXSTYLE)
    | WS_EX_NOACTIVATE | WS_EX_APPWINDOW);
ShowWindow(winHandle, SW_SHOW);

In diesen PyQt-Code:

def no_focus(self):
        import ctypes, win32con, win32gui
        dc = win32gui.GetWindowDC(self.winId())
        user32 = ctypes.windll.user32
        user32.SetWindowLongW(dc, win32con.GWL_EXSTYLE, user32.GetWindowLongW(dc, win32con.GWL_EXSTYLE) | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_APPWINDOW)

Wir würden Sie gerne den folgenden voll funktionsfähigen Code sehen und testen lassen:

__author__ = 'Eko Wibowo'

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class FSTabHeader(QFrame):
    def __init__(self, parent):
        super(FSTabHeader, self).__init__(None)
        self.mainwindow = parent
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SplashScreen)
        self.setFocusPolicy(Qt.NoFocus)
        self.setAttribute(Qt.WA_ShowWithoutActivating)

        layout = QHBoxLayout(self)
        layout.setSpacing(0)
        layout.setContentsMargins(0, 0, 0, 0)

        tab_text = 'Click me'
        self.btn_tab = QPushButton(self)
        self.btn_tab.setStyleSheet('border:1px')
        self.btn_tab.setContentsMargins(0,0,0,0)
        self.btn_tab.setText(tab_text)
        self.btn_tab.setMinimumHeight(25 + 1)
        self.btn_tab.setMaximumHeight(25 + 1)
        self.btn_tab.setMinimumWidth(60)
        self.btn_tab.setMaximumWidth(60)

        self.btn_tab.setCursor(Qt.PointingHandCursor)
        self.btn_tab.clicked.connect(self.dummy)

        layout.addWidget(self.btn_tab)

        self.setLayout(layout)
        self.show()

    def dummy(self):
        print 'it create flashes effect on mainwindow titlebar'
        self.mainwindow.activateWindow()

    def no_focus(self):
        import ctypes, win32con, win32gui
        dc = win32gui.GetWindowDC(self.winId())
        user32 = ctypes.windll.user32
        user32.SetWindowLongW(dc, win32con.GWL_EXSTYLE, user32.GetWindowLongW(dc, win32con.GWL_EXSTYLE) | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_APPWINDOW)


    def adjust_position(self):
        top_left = self.mainwindow.mapToGlobal(self.mainwindow.rect().topLeft())
        self.move(top_left.x() + 20 + 5, top_left.y() - self.height() + 1)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.tab_header = FSTabHeader(self)
        self.tab_header.no_focus()

    def resizeEvent(self, *args, **kwargs):
        self.tab_header.adjust_position()

    def moveEvent(self, *args, **kwargs):
        self.tab_header.adjust_position()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    mainWindow = MainWindow(None)
    mainWindow.show()
    app.exec_()

Irgendwelche Vorschläge?