如何将QT对话框设为只读?有任何一般方法可以轻松实现吗?例如
(1)将所有包含的小部件设置为禁用。 (如何实现?)
(2)拦截编辑事件,如按下键,按下鼠标但是如何不拦截关闭对话框?
我认为此功能应该非常有用。
答案 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();