如何将PyQt QProcess窗口置于最前面?

时间:2018-07-31 20:56:50

标签: python-3.x pyqt gnuplot pyqt5 qprocess

我正在启动QProcess,并希望每次将命令写入QProcess时都将结果窗口置于顶部。

但是,如果我的进程是“ gnuplot.exe”(Win7),则绘图窗口将被更新,但始终位于PyQt窗口后面。我还没有找到一种方法可以将其放在最前面,也不能使其活跃起来,也不能专注于它,或者您会称呼它。 就像是 自我过程。 ... raise(),show(),activateWindow(),SetForegroundWindow,WindowStaysOnTopHint ... ???

这些帖子对我没有进一步的帮助

How to find the active PyQt window and bring it to the front

https://forum.qt.io/topic/30018/solved-bring-to-front-window-application-managed-with-qprocess/3

Bring QProcess window to front (running Qt Assistant)

代码如下:

import sys
from PyQt5.QtCore import QProcess, pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton 
import subprocess

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()

        self.setGeometry(100,100,500,500)
        self.button1 = QPushButton('New plot',self)
        self.button1.clicked.connect(self.button1_clicked)
        self.process = QProcess(self)
        self.process.start(r'C:\Programs\gnuplot\bin\gnuplot.exe', ["-p"])
        self.n = 1

    def button1_clicked(self):
        plotcmd = "plot x**"+str(self.n)+"\n"
        self.process.write(plotcmd.encode())
        self.n += 1
        response = self.process.readAllStandardOutput()
        print(str(response, encoding="utf-8"))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("plastique")
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

基于@ buck54321的评论和链接,我了解了以下版本,该版本似乎(几乎)可以正常工作。 对于我的情况,以上链接中的解决方案似乎更通用且有点复杂,因为我知道要显示在前面的窗口的确切名称。 在我的原始代码中,我只需要添加三行。我不熟悉win32gui。

但是,使用我的代码,只有在第二次按下按钮之后,窗口才会显示在最前面。在第一个按钮按下后,hwnd仍为0,这将导致崩溃。我猜这是因为gnuplot.exe将在不打开窗口的情况下启动,并且仅在发送第一个命令后才打开窗口。 如果没有人可以告诉我如何将窗口置于最前面,即使在单击第一个按钮之后也是如此。

如果有限制或改进,我很乐意了解它们。

代码如下:

import sys
from PyQt5.QtCore import QProcess, pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton 
import subprocess
import win32gui     ####### new line

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,500,500)
        self.button1 = QPushButton('New plot',self)
        self.button1.clicked.connect(self.button1_clicked)
        self.process = QProcess(self)
        self.process.start(r'C:\Programs\gnuplot\bin\gnuplot.exe', ["-p"])
        self.n = 1

    def button1_clicked(self):
        plotcmd = "set term wxt 999\n plot x**"+str(self.n)+"\n"
        self.process.write(plotcmd.encode())
        self.n += 1
        hwnd = win32gui.FindWindow(None, "Gnuplot (window id : 999)")  ####### new line
        response = self.process.readAllStandardOutput()
        print(str(response, encoding="utf-8"))
        if hwnd != 0: win32gui.SetForegroundWindow(hwnd)   ####### new line

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("plastique")
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())