2017-03-11 14 views
0

버튼 스타일의 단 하나의 기능 만 변경하는 방법은 모두 기본 스타일의 기능을 대체하는 것처럼 보입니다. 하나의 기능 만 변경하는 방법이 있습니까?QT QML 구성 요소의 을 변경하는

예를 들어, 빨간색 버튼을 원한다고 가정하십시오.

import QtQuick 2.7 
import QtQuick.Controls 1.4 
import QtQuick.Controls.Styles 1.4 

ApplicationWindow 
{ 
    visible: true 
    width: 640 
    height: 480 

    Button 
    { 
     height: 200 
     width: 200 
     text: "Press me" 
     style: ButtonStyle 
     { 
      // changes background but also throws away everything else 
      // in standard button style 
      background: Rectangle { color: "red" } 
     } 
    } 
} 

다시 정의하는 backgroundButtonStyle 버튼의 색상을 변경하기위한 좋은,하지만 시스템 기본 ButtonStyle 내에서 다른 모든 사라 작동합니다. 예를 들어, 테두리와 클릭 하이라이트.

한 기능을 변경하고 나머지 기능을 유지하는 방법은 무엇입니까?

죄송합니다. 이전에 질문이 있으시면 죄송합니다.

덕분에,

업데이트

위의 질문은 컨트롤 1,하지만 같은 문제가 컨트롤 2. 여기에 컨트롤 2.

import QtQuick 2.7 
import QtQuick.Controls 2.1 

ApplicationWindow 
{ 
    visible: true 
    width: 640 
    height: 480 

    Button 
    { 
     height: 200 
     width: 200 
     text: "Press me" 

     // changes background but also throws away everything else 
     // in standard button style 
     background: Rectangle { color: "red" } 
    } 
} 

답변

1

서문에 대해 동일한 예제 코드의 존재
QtQuick.Controls 1.4의 목적은 기본 모양과 느낌으로 컨트롤을 제공하는 것입니다.. 더 쉽게 조정할 수있는 컨트롤을 원하고 기본 표정이 필요하지 않은 경우QtQuick.Controls 2.0보다 새롭고 빠른 것을 고려해야합니다.

홈페이지
당신이 원하는 것은 - AFAIK - 불가능, 기본 스타일이 Image이 가장 중요한 것 같다 두 RectanglesImage에서 구성되어있다. 이 위치에서 와 Mingw -package의 이미지를 찾을 수 있습니다 :

Qt는을 \ Qt5.7.0 5.7 \ \ mingw53_32 \ QML \ QtQuick \ 자료 \ 스타일 \ 이미지

으로 \ 제어 컨트롤의 개체에 액세스, 당신이 여기에서 찾을 : 그래서

Button { 
     id: but2 
     x: 50 
     onClicked: console.log(this.children[1].item.children[0].item.children[0], this.children[1].item.children[0].item.children[1], this.children[1].item.children[0].item.children[2]) 
    } 

, 가장 쉬운 해결책은, 내 마음에 팝업은 사용하는 것입니다 Colorize

import QtQuick 2.0 
import QtQuick.Window 2.0 
import QtQuick.Controls 1.4 
import QtQuick.Controls.Styles 1.4 
import QtGraphicalEffects 1.0 
Window { 
    width: 1024 
    height: 800 
    visible: true 

    Button { 
     id: but 
     text: 'test' 
    } 
    Colorize { 
     source: but 
     anchors.fill: but 

     // values from the documentation example. 
     hue: 0.0 
     saturation: 0.5 
     lightness: -0.2 
    } 
} 

더 일반적인 경우 : 스타일을 조정하려면 쉐이더로 이동하십시오.

QtQuick.Controls
2.0이 다른 경우가 다음 background그냥 Rectangle하지 Component입니다. 그러나 자신을 지정하지 않으면 Button 이후에만 생성됩니다.

Button { 
    id: but1 
    background.color: 'red' 
} 

색을 지정하려고 할 때 배경이 인스턴스화되지 않으므로 불가능합니다.
당신은이 작업을 수행 할 Component.onCompleted 핸들러를 사용할 수 있습니다 다음 Button

Button { 
    id: but1 
    Component.onCompleted: background.color = Qt.binding(function() { return (but1.pressed ? 'red' : 'green') } 
} 
을 누르면 beeing는 동안
Button { 
    id: but1 
    Component.onCompleted: background.color = 'red' 
} 

그러나 물론 원래 스타일의 Binding 덮어 쓰기가, 색상 변화를 처리

을 사용하면 색상을 다시 변경할 수 있지만 원래 색상은 아닙니다. 당신은 그것을 시도하여 시킴으로 빨리 색상을 가져 오지 있습니다

Button { 
    id: but1 
    onPressed: console.log(this.background.color) 
    onReleased: console.log(this.background.color) 
} 

이 출력됩니다 당신에게 pressed의 두 가지 상태의 색상. 하지만 어쩌면 더 있습니다! 그러므로 가장 쉬운 해결책은 조건부 Binding을 다음과 같이 사용하는 것입니다.

Button { 
    id: but1 
} 

Binding { 
    when: but1.pressed 
    target: but1 
    property: 'background.color' 
    value: 'red' 
} 
+0

bugger. 미안 해요, Controls2.Button을 사용하고 있어야합니다. 나는 이것을 바꿨지 만,'Label' ->'contentItem'을 제외하고는 똑같습니다. 그렇다면 나는 배경을 말할 때마다 같은 문제를 겪는다. 나는 쉐이더와'Colorize'에 대한 당신의 생각을 좋아합니다. 이 속성을 변경하는 것보다 스타일을 추가하는 것이 더 좋은 방법이라고 생각합니다. FWIW, 나는 당신이 어떻게 든 원래를 상속받을 수 없다면 속성이 나쁜 디자인이라고 생각합니다. 감사. 나는 너의 제안과 함께 갈거야. –

+1

실제로 사용하고있는 것을 반영하도록 질문을 업데이트하십시오. 두 가지 매우 다른 스타일 API입니다. – Mitch

+0

QtQuick.Controls 2.x와 함께 가지고있는 몇 가지 가능성에 대한 답변을 이미 업데이트했지만 질문을 업데이트하고 일치시켜 다른 사람들에게도 도움이 될 수 있습니다. 찾고있는 내용이 포함되어 있다면 답변을 수락하는 것을 잊지 마시기 바랍니다. 다른 질문에 대한 모든 대답은 다음과 같이하십시오 : 답변 할 시간이 걸린 사람들에게 예의 바르고, 사람들과 동일한 문제가있는 경우 사람들이 답변을 찾도록 도울 수 있습니다. – derM