如何使 QT 对话框只读?有什么通用的方法可以轻松实现它吗?例如
(1) 将其所有包含的小部件设置为禁用。(如何实现?)
(2)拦截编辑事件,如按键,鼠标按下,但如何不拦截关闭对话框的事件?
我认为这个功能应该很有帮助。
禁用小部件可以类似于以下操作:
void myDialog::disableWidgets()
{
QList<QWidget *> widgets = this->findChildren<QWidget *>();
foreach(QWidget* widget, widgets)
{
widget->setEnabled(false);
}
}
为了拦截事件,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);
只读是一个适用于对话框的奇怪术语。如上所述禁用所有小部件就可以了。如果您只想将 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();