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?