PyQt:从对话框中访问主窗口的数据?

时间:2012-08-12 07:14:09

标签: python pyqt qdialog qmainwindow

所以,我正在使用Python和PyQt。我有一个包含QTableWidget的主窗口,以及一个以模态方式打开并且有一些QLineEdit小部件的对话框......到目前为止,我有2个问题:

  1. 当对话框打开时,我的主窗口冻结了,我真的不喜欢这样......

  2. 当我完成编辑QLineEdit时,我想要的是程序将搜索QTableWidget,如果表中存在QLineEdit中的文本,则会出现一个对话框,并提供相关信息。这是一般的想法。但是,到目前为止,我似乎只能创建一个新的QTableWidget实例,而且我无法使用现有的数据......

  3. 我该怎么办?

1 个答案:

答案 0 :(得分:6)

您写道:

  

以及以模态方式打开的对话框

然后:

  

当对话框打开时,我的主窗口冻结

文档say

  

int QDialog::exec () [slot]

     

将对话框显示为模式对话框,   阻止,直到用户关闭它。该函数返回DialogCode   结果。如果对话框是应用程序模式,则用户无法与之交互   同一个应用程序中的任何其他窗口,直到它们关闭对话框。

     

如果对话框是窗口模态,则只与父窗口交互   对话框打开时被阻止。默认情况下,对话框是   申请模式。

关于modeless dialogs

  

无模式对话框是一个独立于其他对话框的对话框   同一个应用程序中的窗口。查找和替换对话框   字处理器通常无模式以允许用户与之交互   应用程序的主窗口和对话框。

     

无模式   使用show()显示对话框,将对照返回给   立即打电话。

一个例子:

import sys
from PyQt4 import QtCore, QtGui


class SearchDialog(QtGui.QDialog):

    def __init__(self, parent = None):
        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle('Search')
        self.searchEdit = QtGui.QLineEdit()
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.searchEdit)
        self.setLayout(layout)


class MainWindow(QtGui.QDialog):

    def __init__(self):
        QtGui.QDialog.__init__(self, None)
        self.resize(QtCore.QSize(320, 240))
        self.setWindowTitle('Main window')
        self.logText = QtGui.QPlainTextEdit()
        searchButton = QtGui.QPushButton('Search')
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.logText)
        layout.addWidget(searchButton)
        self.setLayout(layout)
        searchButton.clicked.connect(self.showSearchDialog)

    def showSearchDialog(self):
        searchDialog = SearchDialog(self)
        searchDialog.show()
        searchDialog.searchEdit.returnPressed.connect(self.onSearch)

    def onSearch(self):
        self.logText.appendPlainText(self.sender().text())



def main():
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

if __name__ == "__main__":
    main()

点击“搜索”以打开搜索窗口(您可以打开其中的几个)。输入要搜索的文本,然后按Enter键。要搜索的文本将添加到主窗口的日志中。