Пишу свой инспектор объектов для миниSCADA.
Создал наследника от QWidget EditableWidget, задача которого разместить в себе дочерний виджет (обычно это будет либо lineEdit либо textEdit).
При получении фокуса, будет рядом отображаться кнопка с текстом "...", при нажатии на которую нужно послать сигнал.
При потере фокуса кнопка исчезает. Суть понятна, это стандартная фишка всех инспекторов объектов.
Сами эти виджеты я распологаю в таблице методом setCellWidget. Про делегаты я слышал но пока не вникал. при чем, виджеты будут встраиваться разные.
QEditableWidget::QEditableWidget(QWidget *parent) :
QWidget(parent)
{
ftoolButton = NULL;
feditableWidget = NULL;
setFocusPolicy(Qt::ClickFocus);
}
void QEditableWidget::setEditableWidget(QWidget * EditableWidget)
{
if(feditableWidget!=EditableWidget)
{
setUpdatesEnabled(false);
if(feditableWidget)
{
setFocusProxy(NULL);
delete feditableWidget;
delete ftoolButton;
}
feditableWidget = EditableWidget;
if(feditableWidget)
{
feditableWidget->setParent(this);
feditableWidget->setFocusPolicy(Qt::NoFocus);
feditableWidget->setGeometry(rect());
}
setUpdatesEnabled(true);
}
}
void QEditableWidget::focusInEvent(QFocusEvent * event)
{
if(feditableWidget)
{
feditableWidget->setGeometry(rect().adjusted(-1,-1,geometry().width()-geometry().height(),0));
}
ftoolButton = new QToolButton;
ftoolButton->setText("...");
ftoolButton->setParent(this);
ftoolButton->setGeometry(rect().adjusted(geometry().width()-geometry().height(),-1,-1,0));
ftoolButton->show();
connect(ftoolButton,SIGNAL(clicked()),this,SIGNAL(editButtonClicked()));
QWidget::focusInEvent(event);
}
void QEditableWidget::focusOutEvent(QFocusEvent * event)
{
QWidget::focusOutEvent(event);
delete ftoolButton;
if(feditableWidget) feditableWidget->setGeometry(rect());
}
Проблема, как сделать так, что бы отловить событие получение фокуса моим виджетом, затем отобразить кнопку, а потом установить фокус ввода на дочерний виджет, при этом отловить потерю фокуса уже в дочернем виджете что бы кнопка исчезла.