Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何在不失去主窗口焦点的情况下显示可点击的QFrame?_Qt_Pyqt_Qmainwindow - Fatal编程技术网

Qt 如何在不失去主窗口焦点的情况下显示可点击的QFrame?

Qt 如何在不失去主窗口焦点的情况下显示可点击的QFrame?,qt,pyqt,qmainwindow,Qt,Pyqt,Qmainwindow,最后,我能够创建一个。在尝试移植失败后,我修改了我的想法:通过显示一个自由浮动的QFrame(QFrame)进行视觉欺骗,该QFrame可以调整大小并与主窗口一起移动。当然这不是一个完美的解决方案,例如,当另一个应用程序位于主应用程序窗口的顶部时,该代码仍然无法解决何时禁用最顶层提示的问题,但我认为这很容易解决 在本页中,我想问的是,如何防止QFrame窗口按钮上的单击操作从主窗口窃取焦点?目前,我只是在单击操作发生时重新激活主窗口。但它会在主窗口标题栏上产生闪烁效果。我相信,但是我还没有能够从

最后,我能够创建一个。在尝试移植失败后,我修改了我的想法:通过显示一个自由浮动的QFrame(QFrame)进行视觉欺骗,该QFrame可以调整大小并与主窗口一起移动。当然这不是一个完美的解决方案,例如,当另一个应用程序位于主应用程序窗口的顶部时,该代码仍然无法解决何时禁用最顶层提示的问题,但我认为这很容易解决

在本页中,我想问的是,如何防止QFrame窗口按钮上的单击操作从主窗口窃取焦点?目前,我只是在单击操作发生时重新激活主窗口。但它会在主窗口标题栏上产生闪烁效果。我相信,但是我还没有能够从C++代码中创建一个成功的结果:

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);
在此PyQt代码中:

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)
希望您能看到并测试以下完整的功能代码:

__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_()

有什么建议吗?

win32con,win32gui我想你只是为Windows操作系统做的,如何让它在OSx或Linux上工作?嗯,是的,请原谅。我的解决方案仅针对Windows。只有关于非窃取焦点窗口的部分仅适用于Windows。标题栏中的另一个技巧选项卡适用于其他我想,还没有尝试过