crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сабклассинг QLineEdit
Rocky
  опции профиля:
сообщение 29.1.2010, 0:30
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Всем привет! Сделал класс-наследник от QLineEdit. А как обрабатывать изменение позиции курсора и отрисовывать его мигание например? И как быть с выделением? Я делаю сабклассинг так (пока только набросок):
//.h
class CPasswordEdit : public QLineEdit
    {
        Q_OBJECT

        QString m_sPasswd;
        bool m_bPasswdModeEnabled;

    public:
        CPasswordEdit(bool bEnablePasswdMode, QWidget *pParent = 0);
        virtual ~CPasswordEdit();

    private slots:
        void paintEvent(QPaintEvent *pEvent);
        void keyPressEvent(QKeyEvent *pEvent);
    };


//.cpp
void CPasswordEdit::paintEvent(QPaintEvent *pEvent)
{
    QPainter oPainter(this);

    const int nW = this->rect().width();
    const int nH = this->rect().height();

    //рамка
    QPen oPen(Qt::red);
    oPen.setWidth(2);

    //линейный градиент
    QLinearGradient oLinearGradient(0, 0, 0, nH);
    oLinearGradient.setSpread(QGradient::ReflectSpread);
    oLinearGradient.setColorAt(0.0, Qt::white);
    oLinearGradient.setColorAt(0.5, Qt::red);
    oLinearGradient.setColorAt(1.0, Qt::red);

    QBrush oBrush(oLinearGradient);
    oPainter.setBrush(oBrush);
    oPainter.setPen(oPen);
    
    //рисуем виджет
    QPainterPath oPainterPath;
    oPainterPath.addRoundRect(1, 1, nW - 1, nH - 1, 100, 100);
    oPainter.setClipPath(oPainterPath);
    oPainter.drawPath(oPainterPath);

    //выводим текст
    if(!m_sPasswd.isNull())
    {
        //шрифт
        QFont oFont;
        oFont.setPointSize(15);

        oPainter.setFont(oFont);
        oPainter.setPen(Qt::white);
        oPainter.setOpacity(1.0);
        oPainter.drawText(0, 0, nW, nH, Qt::AlignCenter, m_sPasswd);
    }

    pEvent->accept();
}
//---------------------------------------------------------------------------------------------------------------------//
void CPasswordEdit::keyPressEvent(QKeyEvent *pEvent)
{
    m_sPasswd += "X";
    pEvent->accept();
    this->repaint();
}
//---------------------------------------------------------------------------------------------------------------------//
//usage
PlayStationClientWidgets::CPasswordEdit *m_pLineEdit1 = new PlayStationClientWidgets::CPasswordEdit(false);
PlayStationClientWidgets::CPasswordEdit *m_pLineEdit2 = new PlayStationClientWidgets::CPasswordEdit(true);
.....

Или это получается как будто я делаю свой кастом контрол? Просто с таким подходом возникает ощущение что я не расширяю возможности QLineEdit а делаю все сам заново... Помогите плиз разобраться =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 23:30