我需要创建一个包含多行的文本输入对话框。有没有办法使用QInputDialog做到这一点?
如果没有,最简单的建议是继承QPlainTextEdit吗?
答案 0 :(得分:1)
QInputDialog,更准确地说getText仅适用于QLineEdit。
只需实现一个包含QPlainTextEdit的小对话子类。不应该是太多的工作。没有QInputDialog快,但也没有太多的努力。
更新:自版本Qt 5.2起,QInputDialog已getMultiLineText。
答案 1 :(得分:0)
我需要它在Qt4中工作,这是我发现的极少数问题之一,没有一个实现可以作为答案。我已经设法复制了Qt5的功能和外观,因此,即使它在Python中,我也可能会在这里发布,因为它可能会对其他人有用。
要使其正常工作,它需要自己的布局,并且由于QInputDialog
建立了布局,因此QDialog
必须被子类化。然后,我在getMultiLineText
上添加了QInputDialog
,它返回了QPlainTextEdit
的读数以及新对话框的结果。
class _QInputDialogMultiline(QDialog):
"""Build a replica interface of QInputDialog.getMultilineText."""
def __init__(self, parent, title, label, text='', **kwargs):
super(_QInputDialogMultiline, self).__init__(parent, **kwargs)
if title is not None:
self.setWindowTitle(title)
self.setLayout(QVBoxLayout())
self.layout().addWidget(QLabel(label))
self.textEdit = QPlainTextEdit()
self.layout().addWidget(self.textEdit)
buttonLayout = QHBoxLayout()
buttonLayout.addStretch()
okButton = QPushButton('OK')
buttonLayout.addWidget(okButton)
cancelButton = QPushButton('Cancel')
buttonLayout.addWidget(cancelButton)
self.layout().addLayout(buttonLayout)
self.textEdit.setPlainText(text)
self.textEdit.selectAll()
okButton.clicked.connect(self.accept)
cancelButton.clicked.connect(self.reject)
class QInputDialog(QInputDialog):
@classmethod
def getMultiLineText(cls, parent, title, label, text='', **kwargs):
dialog = _QInputDialogMultiline(parent, title, label, text, **kwargs)
result = dialog.exec_()
return (str(dialog.textEdit.toPlainText()), bool(result))
显示它们外观相同的示例:
QInputDialog.getMultiLineText(None, 'Window Title', 'This is a label.', 'Initial text')
Qt4(我的代码):
Qt5(标准代码):
答案 2 :(得分:-1)
要从QInputDialog :: getText()将用户的输入检索到可扩展的字符串中:
bool ok;
std::string* comment = new std::string;
QString qComment = QInputDialog::getText(0,
"<title_of_input_dialog_displayed_at_top>",
"<label_of_input_field_displayed_at_left>",
QLineEdit::Normal, "<enter_this_or_that_here>", &ok);
if (ok && !qComment.isEmpty()) {
QByteArray qba = qComment.toLocal8Bit();
comment->assign(qba.data(), qba.size());
} else if (ok) { // user clicked Ok but did not enter text
comment->assign("<default_user_input>");
} else { // user clicked Cancel
...
}
delete comment;