2017-04-06 30 views
0

我正在嘗試implement my own style,爲此我想覆蓋內置對象。下面是我在做什麼:Qt Quick Controls 2在覆蓋時掛起Button.qml

// main.cpp 
QQuickStyle::setStyle("mystyle"); 

// mystyle/Button.qml 
import QtQuick 2.5 
import QtQuick.Controls 2.1 as Controls 

Controls.Button { 
    background: Rectangle { 
     color: "green" 
    } 
} 

// qml.qrc 
<RCC> 
    <qresource prefix="/"> 
     <file>main.qml</file> 
     <file>mystyle/CheckBox.qml</file> 
    </qresource> 
</RCC> 

按照文檔我相信這應該會自動using file selectors工作。

但是,我的應用在啓動時掛起。我的猜測是我陷入了遞歸導入。我如何正確地做到這一點?

+0

我可能在這裏找到了答案:https://forum.qt.io/topic/76704/subtyping-the-default-type-in​​-a-theme-controls-2/3如果這是真的,那麼我的承諾是不可能的。 –

回答

4

Qt的快速控制2造型系統基於QML類型註冊。當您使用mystyle運行應用程序時,此類型稱爲QtQuick.Controls.Button ISmystyle/Button.qml。因此mystyle/Button.qml不能繼承QtQuick.Controls.Button。它不能繼承自己。

這是基本相同編寫以下C++:

// button.h 
#include "button.h" 
class Button : public Button {}; 

有點激進,但容易理解的類比。 :)

你可以做的是有(My)Button.qml的地方,讓它繼承QtQuick.Controls.Button,並且不要將它註冊爲Qt Quick Controls 2,而只需導入文件夾。這就是我們所說的「Customizing Qt Quick Controls 2」。

+1

話雖如此,QML引擎絕對應該拋出一個錯誤而不是掛起,我們應該在Qt Quick Controls 2樣式文檔中加以說明。你不是第一個嘗試這個的人。 :) – jpnurmi

0
  1. 加載導入Qt Quick Control的QML之前,必須先配置樣式。在QML類型註冊後不可能更改樣式。 setStyle()

  2. 在您的自定義樣式的qml文件中應用現有樣式。

注意:建議使用QQmlApplicationEngine,它在內部創建一個QQmlFileSelector實例。這是QML文件選擇器投入使用所需的全部功能。

參見:Creating Custom Styles

+0

感謝您的回答!在我刪除樣式名稱前面的'+'後,這部分工作正常,我認爲這肯定是文檔中的錯誤。我只是用我對這個問題的知識來更新這個問題。似乎我不知道如何導入默認的擴展樣式。 –