Qt:接管系统打开文件对话框

时间:2012-11-06 22:24:13

标签: c++ python qt pyqt pyqt4

我想使用PyQt4的QWebView自动将文件上传到网站,但还有一部分我还想不通。要上传文件,网站上有一个按钮,打开一个对话框,您可以从中选择本地文件。所以,这些是我的问题:)有没有办法在我点击按钮后控制该对话框?有没有更好的方法来实现这一目标?

修改

该网站为https://maps.google.com/,我通过我的地点>上传.kml文件创建地图>导入

3 个答案:

答案 0 :(得分:4)

您正在寻找的是QWebPage::chooseFile()(我想这也取决于网站如何处理)。重新实现并查看是否足够。做任何你想做的事情并返回选择的文件路径。

编辑:现在您提供了我测试过的链接,似乎可以正常工作。

答案 1 :(得分:1)

好的,开始让我先从背景信息和参考文献开始。

我将使用的模块是pywin32下载here,特别是win32gui,API参考here

现在,在您可以操作对话框之前,您必须“导航”到窗口句柄,以下使用win32.FindWindow API参考here,它看起来像这样,其中两个输入是{{ 1}}在这种情况下lpclassName(代表对话)参考here#32770,在这种情况下是lpWindowName

File Upload

查找文件句柄的代码:

HWND WINAPI FindWindow(
  _In_opt_  LPCTSTR lpClassName,
  _In_opt_  LPCTSTR lpWindowName
); 

它存储句柄,在我的例子中是import win32gui control = win32gui.FindWindow("#32770", "File Upload")

下一步是在对话框中找到GUI对象的句柄,我将显示721470按钮的示例。要查找句柄,我将在此处使用Cancel API参考,

FindWindowEx

import win32con import win32api ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel"); win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0) 的参考hereBM_CLICK的{​​{3}}。

最终代码:

SendMessage

另一种方法是使用import win32gui import win32api import win32con window = win32gui.GetForegroundWindow() title = win32gui.GetWindowText(window) control = win32gui.FindWindow("#32770", "File Upload") ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel") win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0) 模块,here,例如:

watsup.winGuiAuto

但我相信最简单的方法是使用from watsup.winGuiAuto import * optDialog = findTopWindow(wantedText="File Upload") CancelButton = findControl(optDialog,wantedClass="Button", wantedText="Cancel") clickButton(SaveButton) here,我之前在pyqt中使用它来拍摄命令。

希望这有帮助!

其他参考文献(pywin32版本):

autoit here

win32gui here

答案 2 :(得分:1)

我认为@LucaCarlon给出的解决方案是正确的,值得奖励。

这是经过测试的纯PyQt4演示,或多或少地再现了默认实现:

import sys
from PyQt4 import QtCore, QtGui, QtWebKit

class WebPage(QtWebKit.QWebPage):
    def chooseFile(self, frame=None, path=''):
        return QtGui.QFileDialog.getOpenFileName(self.parent(), '', path)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    view = QtWebKit.QWebView()
    view.setPage(WebPage(view))
    view.load(QtCore.QUrl('https://maps.google.com/'))
    view.show()
    sys.exit(app.exec_())