如何将 PyQt QProcess 窗口置于前面?
Posted
技术标签:
【中文标题】如何将 PyQt QProcess 窗口置于前面?【英文标题】:How to bring PyQt QProcess window to front? 【发布时间】:2018-07-31 20:56:49 【问题描述】:我正在启动一个 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_())
【问题讨论】:
不幸的是,这将是系统特定的。请参阅***.com/a/2091530/1124661 以讨论它是如何在 Windows 中完成的。另请参阅***.com/a/17273638/1124661,了解如何使用进程 ID 查找窗口。你可以使用QProcess::processId()
来获得它。
【参考方案1】:
根据@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_())
【讨论】:
以上是关于如何将 PyQt QProcess 窗口置于前面?的主要内容,如果未能解决你的问题,请参考以下文章