4

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

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

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

我能对这些做些什么?

4

1 回答 1

7

你写了:

和一个模态打开的对话框

进而:

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

文档

int QDialog::exec () [slot]

将对话框显示为模态对话框,在用户关闭它之前一直处于阻塞状态。该函数返回一个DialogCode 结果。如果对话框是应用程序模式,则用户在关闭对话框之前不能与同一应用程序中的任何其他窗口进行交互。

如果对话框是窗口模式,则在对话框打开时仅阻止与父窗口的交互。默认情况下,对话框是应用程序模式。

关于无模式对话框

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

使用 显示无模式对话框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。要搜索的文本将添加到主窗口的日志中。

于 2012-08-12T10:41:14.480 回答