Russian Qt Forum
Октябрь 01, 2024, 02:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Делегат: поле ввода и кнопка  (Прочитано 7615 раз)
Kunashir
Гость
« : Март 11, 2011, 14:13 »

День добрый!
Потребовалось использовать такой делегат: ну сделал свой класс, наследник от QFrame, на нем разместил Layout, QLineEdit и QPushButton. В делегате этот класс использовал в качестве редактора - все вроде отлично, при начале редактирования ячейки QTableView появляется QLineEdit и QPushButton - но если сразу попытаться нажать на кнопку, редактирования прекращается и редактор закрывается, а когда сперва клацнуть по QLineEdit, то потом можно спокойно нажимать кнопку и закрытия редактора не происходит.
Собственно как сделать так чтобы сразу можно было жать на кнопку?
В идеале должно быть как при использовании QSpinBox в делегате - там то кнопки сразу можно щелкать.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 11, 2011, 14:24 »

попробуй у кнопки выставить setFocusPolicy( Qt::NoFocus )
Записан

Qt 5.11/4.8.7 (X11/Win)
Kunashir
Гость
« Ответ #2 : Март 11, 2011, 14:31 »

попробуй у кнопки выставить setFocusPolicy( Qt::NoFocus )

К сожалению не помогло!
Записан
alexman
Гость
« Ответ #3 : Март 11, 2011, 15:11 »

Может код покажешь?
Записан
Kunashir
Гость
« Ответ #4 : Март 11, 2011, 15:17 »

Виджет
Код:
class CEditLineButton : public QFrame
{
    Q_OBJECT
public:
    explicit CEditLineButton(QWidget *parent = 0);
    ~CEditLineButton ();
    void setTextToEditLine (QString text);
signals:
    void clickButton ();

public slots:
   
private slots:
    void clicked ();
private:
    QLineEdit *lineEdit;
    QToolButton *button;
    QHBoxLayout *layout;
};

//реализация
#include "ceditlinebutton.h"

CEditLineButton::CEditLineButton(QWidget *parent) :
    QFrame(parent)
{
    setFrameShape(QFrame::NoFrame);
    lineEdit = new QLineEdit (this);
    button = new QToolButton (this);

    layout = new QHBoxLayout (this);
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addWidget(lineEdit);
    layout->addWidget(button);
    button->setSizePolicy (QSizePolicy::Fixed,QSizePolicy::Minimum);
    lineEdit->setSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect (button, SIGNAL (clicked()), this, SLOT (clicked()));
    button->setText("...");
    //lineEdit->setFocus();
   lineEdit->setReadOnly(false);
 
   // lineEdit->setFocusProxy(button);
}

CEditLineButton::~CEditLineButton()
{
    delete lineEdit;
    delete button;
}



void CEditLineButton::clicked()
{
    emit clickButton();
}

void CEditLineButton::setTextToEditLine(QString text)
{
    lineEdit->setText(text);
}

Делегат:

Код:
// Класс-делегат, который реализует интерфейс доступа к справочнику
// когда класс CCatalogPerson участвует как ссылочный (пример, класс Пользователи)
class DelegatPerson : public QItemDelegate
{
    Q_OBJECT
public:
    DelegatPerson (int id, QObject *parent = 0);
    QWidget *createEditor(QWidget *parent,
                          const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData (QWidget *editor, const QModelIndex &index) const;
    void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry (QWidget *editor,
                              const QStyleOptionViewItem &option, const QModelIndex &index) const;
    virtual void paint (QPainter *painter,
                const QStyleOptionViewItem& option, const QModelIndex& index ) const;
public slots:
    void showPesonCatalog ();
private:
    CCatalogPerson catPerson;
   // ViewPerson *editor;
};

//реализация
DelegatPerson::DelegatPerson (int id, QObject *parent)
    : QItemDelegate (parent)
{
    //TODO: в дальнейшем нужно реализовать чтобы
    //в форме справочника текущим был элемент с id
}

QWidget *DelegatPerson::createEditor(QWidget *parent,
                                     const QStyleOptionViewItem &option, const QModelIndex &index) const
{

    CEditLineButton *editor = new CEditLineButton (parent);
    editor->setTextToEditLine(index.data(Qt::EditRole).toString());
   // editor->installEventFilter(const_cast<DelegatPerson*> (this));
    connect (editor, SIGNAL (clickButton()), this, SLOT (showPesonCatalog()));
    //connect (this, SIGNAL (commitData(editor)), this, SLOT (showPesonCatalog()));
    return  editor;//layout->widget();
}

void DelegatPerson::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    CEditLineButton *myEdit = static_cast<CEditLineButton*> (editor);
    myEdit->setTextToEditLine(index.data(Qt::EditRole).toString());
}

void DelegatPerson::setModelData(QWidget *editor,
                                 QAbstractItemModel *model, const QModelIndex &index) const
{


}

void DelegatPerson::updateEditorGeometry(QWidget *editor,
                                         const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);

}

void DelegatPerson::paint (
            QPainter *painter,
            const QStyleOptionViewItem& option,
            const QModelIndex& index ) const {

    QString text;
    QRect rect;
    QVariant value;
    QStyleOptionViewItemV2 opt = setOptions(index, option);

    value = index.data(Qt::DisplayRole);
    text =  value.toString();//QLocale().toString(value.toString());
    opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
  // painter->drawText();
    drawDisplay(painter, opt, opt.rect, text);

}

void DelegatPerson::showPesonCatalog()
{
    ViewPerson *personTable = new ViewPerson ();
    personTable->setModel(catPerson.getModel());
    personTable->setItemDelegate(new QSqlRelationalDelegate (personTable));
    personTable->setAlternatingRowColors(true);
    personTable->show();
}
Записан
Kunashir
Гость
« Ответ #5 : Март 12, 2011, 12:55 »

Еще вопрос тогда - как сделать чтобы при создании редактора данные в поле ввода выделялись.
В виджете сделал следующую функцию:
void CEditLineButton::setTextToEditLine(QString text)
{
    lineEdit->setText(text);
    lineEdit->setFocus();
    lineEdit->selectAll();
}

она отрабатывает, текст устанавливается, но фокус и выделение не делают свою работу...
Записан
Kunashir
Гость
« Ответ #6 : Март 17, 2011, 16:12 »

Так ладно, сам делегат сделал - поле с кнопкой есть, по кнопке открывается другой TableVeiw. А вот как из него данные в первый передать???

Сделал такую связь:

Код:
connect (personTable, SIGNAL (clicked (const QModelIndex & )), this, SLOT (setRelationData(const QModelIndex &)));

personTable - это соответственно вызываемый TableVeiw (ну при нем конечно модель и т.п.),
setRelationData - функция в делегате
так вот в setRelationData QModelIndex из clicked приходит не верный (invalid).
Хотя если  в рамках personTable посмотреть на то что передает clicked все нормально!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 22.