0

如何使 QT 对话框只读?有什么通用的方法可以轻松实现它吗?例如

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

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

我认为这个功能应该很有帮助。

4

3 回答 3

2

禁用小部件可以类似于以下操作:

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

  foreach(QWidget* widget, widgets)
  {
    widget->setEnabled(false);
  }
}
于 2013-09-13T19:13:51.220 回答
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);
于 2013-09-16T08:27:48.070 回答
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();
于 2019-04-15T18:23:42.177 回答