2014-10-13 2 views
2

Я хотел знать, правильна ли приведенная ниже таблица стилей или нет или какая ошибка. Она не меняет пользовательский интерфейс, даже если я установлен.Установить стиль для дочернего виджета на основе родительского виджета Property Selector - qt

QWidget#itemScrollAreaWidgetContents PosButton[pressed = "false"] QFrame#baseWidget 
{ 
    border: 1px solid black; 
    border-top-width: 0; 
    border-left-width: 0; 
    border-style: outset; 
} 

QWidget#itemScrollAreaWidgetContents PosButton[pressed = "true"] QFrame#baseWidget 
{ 
    border: 1px solid black; 
    border-top-width: 0; 
    border-left-width: 0; 
    border-style: outset; 
} 

Мой пользовательский виджет PosButton имеет набор свойств

Q_PROPERTY(QString pressed READ pressed WRITE setPressed) 

меняю недвижимость на Mouseclick

void PosButton::mouseReleaseEvent(QMouseEvent *event) 
{ 
    qDebug() << Q_FUNC_INFO << "Invoked"; 

    if(rect().contains(event->pos())) 
    { 
     qDebug() << Q_FUNC_INFO << "Emit click"; 
     emit clicked(this->objectName()); 
    } 

    setPressed("false"); 
    style()->unpolish(this); 
    style()->polish(this); 

    qDebug() << Q_FUNC_INFO << "Exits"; 
    return; 
} 

void PosButton::mousePressEvent(QMouseEvent *event) 
{ 
    qDebug() << Q_FUNC_INFO << "Invoked"; 
    Q_UNUSED(event); 
    setPressed("true"); 
    style()->unpolish(this); 
    style()->polish(this); 
    qDebug() << Q_FUNC_INFO << "Exits"; 
    return; 
} 

Кроме того, я попытался установить таблицу стилей. Он активируется, но занимает второе место для обновления в пользовательском интерфейсе. то есть, мне нужно держать мой виджет нажатой в течение секунды для изменения появляются

void PosButton::mouseReleaseEvent(QMouseEvent *event) 
{ 
    qDebug() << Q_FUNC_INFO << "Invoked"; 

    if(rect().contains(event->pos())) 
    { 
     qDebug() << Q_FUNC_INFO << "Emit click"; 
     emit clicked(this->objectName()); 
    } 

    m_pBaseWidget->setStyleSheet("QFrame#baseWidget {" 
          "border: 1px solid black;" 
          "border-top-width: 0;" 
          "border-left-width: 0;" 
          "border-style: outset;}" 
       ); 

    qDebug() << Q_FUNC_INFO << "Exits"; 
    return; 
} 

void PosButton::mousePressEvent(QMouseEvent *event) 
{ 
    qDebug() << Q_FUNC_INFO << "Invoked"; 
    Q_UNUSED(event); 

    m_pBaseWidget->setStyleSheet("QFrame#baseWidget {" 
          "border: 2px solid orange;" 
          "border-top-width: 0;" 
          "border-left-width: 0;" 
          "border-style: outset;}" 
       ); 

    qDebug() << Q_FUNC_INFO << "Exits"; 
    return; 
} 
+0

Является '' PosButton' QPushButton' производного класса? – Iuliu

+0

Нет, это происходит из QWidget – Abin

ответ

0

AFAIK Qt Style Sheets работы для прямых QWidget подклассов, только если вы реализуете paintEvent так:

void PosButton::paintEvent(QPaintEvent *) 
{ 
    QStyleOption opt; 
    opt.init(this); 
    QPainter p(this); 
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); 
} 

Кроме того, что я рекомендуется использует bool типа для pressed собственности, как это:

Q_PROPERTY(bool pressed READ pressed WRITE setPressed) 

и ссылки на недвижимость так же, как вы сделали уже (не уверен, если это нормально, чтобы оставить пространство между и после =):

QWidget#itemScrollAreaWidgetContents PosButton[pressed="false"] QFrame#baseWidget 
+0

@luliu: Я устанавливаю стиль для QFrame внутри моего PosButton. Поэтому набор стилей должен работать, не так ли? – Abin

+0

Да, но при использовании селекторов свойств вызывается получатели и сеттеры для этого свойства. можете ли вы показать функции 'нажатые' и' setPressed'? также, как я сказал, я рекомендую использовать 'Q_PROPERTY (bool нажал READ нажал WRITE setPressed)' вместо 'Q_PROPERTY (String нажал READ нажал WRITE setPressed)' – Iuliu

+0

Я изменил, как вы сказали 'bool PosButton :: нажал() { qDebug() << Q_FUNC_INFO << "Вызывается" << mPressed; возвращение mПредусмотрено; } void PosButton :: setPressed (bool press) { qDebug() << Q_FUNC_INFO << "Вызывается" << нажата; mPressed = нажато; qDebug() << Q_FUNC_INFO << "Выход"; возвращение; } ' – Abin

Смежные вопросы