带有多行文本的QInputDialog

时间:2012-03-08 21:37:32

标签: c++ qt

我需要创建一个包含多行的文本输入对话框。有没有办法使用QInputDialog做到这一点?

如果没有,最简单的建议是继承QPlainTextEdit吗?

3 个答案:

答案 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(我的代码):

enter image description here

Qt5(标准代码):

enter image description here

答案 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;