如何使Qt对话框为只读?

时间:2013-09-13 17:29:36

标签: qt dialog

如何将QT对话框设为只读?有任何一般方法可以轻松实现吗?例如

(1)将所有包含的小部件设置为禁用。 (如何实现?)

(2)拦截编辑事件,如按下键,按下鼠标但是如何不拦截关闭对话框?

我认为此功能应该非常有用。

3 个答案:

答案 0 :(得分:2)

禁用窗口小部件的操作类似于以下内容:

void myDialog::disableWidgets()
{
  QList<QWidget *> widgets = this->findChildren<QWidget *>();

  foreach(QWidget* widget, widgets)
  {
    widget->setEnabled(false);
  }
}

答案 1 :(得分:1)

为拦截事件,QDialog包含函数installEventFilter(QObject *)。

这允许您使用单独的对象来接收传递给对话框的所有事件。然后,您可以选择处理对象中的事件,或通过调用基类QObject :: eventFilter

将其传递给对话框本身。
class MyEventHandler : public QObject
{
    Q_OBJECT

    protected:

    bool MyEventHandler::eventFilter(QObject *obj, QEvent *event)
    {
        // handle key press events
        if (event->type() == QEvent::KeyPress)
        {
            // Do something
            // ...
            return true; // event handled by the class
        }
        else
        {   // ignore this event and pass it to the dialog as usual
            return QObject::eventFilter(obj, event);
        }
    }

    return false;
};


QDialog* dlg = new QDialog;
MyEventHandler evtHandler = new MyEventHandler;

dlg->installEventFilter(evtHandler);

答案 2 :(得分:0)

只读是一个奇怪的术语,适用于对话框。禁用上述所有小部件就可以了。如果只想将QInputDialog的输入部分设为只读(在保持滚动条,按钮等处于启用状态的情况下),则可以如下修改代码:

  QInputDialog dialog(this);
  dialog.setOptions(QInputDialog::UsePlainTextEditForTextInput);
  dialog.setWindowTitle("Title");
  dialog.setLabelText("Label");
  dialog.setTextValue("1\n2\n3\n");

  QList<QWidget *> widgets = dialog.findChildren<QWidget *>();
  foreach(QWidget* widget, widgets) {
    if (strcmp(widget->metaObject()->className(),"QPlainTextEdit")==0) {
      QPlainTextEdit *t = static_cast<QPlainTextEdit*>(widget);
      t->setReadOnly(true);
    }
  }

  dialog.exec();