2016-12-20 1 views
1

QTJambi 및 Webkit에 대한 매우 지속적인 문제가 있습니다.QTJambi 및 Webkit, 투명 배경 문제

내가 원한다.

HTML 코드로 코딩 된 웹 인터페이스를로드하고 (작동) 자바 스크립트와 자바 간 상호 작용을 삽입하고 (작동 함) 이미지를 표시하는 다른 위젯 위에 투명한 배경으로 웹 인터페이스를 표시합니다 (2D 게임의 경치), 웹 인터페이스가 정적 인 동안 작동합니다.

웹 인터페이스가 변경되면 문제가 발생합니다 (DOM 및 CSS 조작). 변경되면 이전 웹보기 렌더링이 지워지지 않고 새 렌더링이 그려집니다. 그래서, 나는 그런 표현이 있습니다

Picture of the graphic bug

내가 어떻게 작동하는지 이해 : 배경 색상으로 사각형 이전 렌더링을 숨기고 새 이상 표시가 표시됩니다. 그러나 배경색은 투명합니다. 그래서 그것은 아무것도 숨 깁니다.

웹에서 컴포지션 모드로 찾은 몇 가지 해결책을 시도했지만 작동하지 않습니다. 나는 같은 문제 또는 검은 화면이있다.

여기 내 코드입니다.

HTML 파일 :

<html> 
<head> 
    <meta charset="utf-8" /> 

    <style> 
     #body 
     { 
      position: absolute; 
      left: 0px; 
      right: 0px; 
      top: 0px; 
      bottom: 0px; 
      overflow: hidden; 
     } 


     #button 
     { 
      position: absolute; 
      left: 20px; 
      top: 20px; 
      background-color: rgba(255, 100, 100, 0.1); 
      padding: 10px; 
      box-shadow: 0px 2px 5px rgb(0, 0, 0); 
      border-radius: 5px; 
     } 

     #token 
     { 
      position: absolute; 
      left: 200px; 
      top: 20px; 
      background-color: rgba(100, 255, 100, 0.1); 
      padding: 10px; 
      box-shadow: 0px 2px 5px rgb(0, 0, 0); 
      border-radius: 5px; 
     } 

     #console 
     { 
      background-color: rgba(100, 100, 255, 0.1); 
      position: absolute; 
      left: 20px; 
      right: 20px; 
      top: 100px; 
      bottom: 20px; 
      padding: 10px; 
      overflow: auto; 
     } 
    </style> 

</head> 

<body> 

    <div id="button" >Appeler Java</div> <!-- Le bouton rouge qui appelle Java --> <!-- This red button calls Java --> 
    <div id="console" >Console. <br /></div> <!-- Le bloc bleu où on affiche les messages --> <!-- Messages are displayed in this blue block. --> 
    <div id="token" >Je bouge.</div> <!-- Le petit bloc vert qui bouge tout seul --> <!-- The moving green block. --> 

    <script type="text/javascript" > 

     // Fonction javascript appelée par Java au chargement de la page 
     // Java calls this Javascript function when the HTML file is loaded. 
     var fromJavaToJavascript = function() 
     { 
      document.getElementById("console").appendChild(document.createTextNode("J'ai été appelé par le Java. ")); 
      document.getElementById("console").appendChild(document.createElement("br")); 
     }; 

     // Mon image qui doit recevoir la QPixmap 
     //var qPixmap = new Image(); 

     var readImage = function() 
     { 
      document.getElementById("console").appendChild(document.createTextNode("Je reçoit une image de java. " + qPixmap)); 
      document.getElementById("console").appendChild(document.createElement("br")); 
     }; 

     window.onload = function() 
     { 
      var count = 0; 

      // Fonction qui appelle Java et déclenchée par le bouton rouge 
      // When the red button is clicked, it calls this javascript function which calls a Java function. 
      document.getElementById("button").onclick = function() 
      { 
       count++; 

       // On affiche l'incrément dans le bouton rouge 
       // Text in red button is updated. 
       while (document.getElementById("button").firstChild) 
        document.getElementById("button").removeChild(document.getElementById("button").firstChild); 

       document.getElementById("button").appendChild(document.createTextNode("Appeler Java " + count)); 

       // On affiche un message dans le bloc bleu 
       // New message is displayed in the blue block. 
       document.getElementById("console").appendChild(document.createTextNode("Je dois appeler le Java. " + javaObject)); 
       document.getElementById("console").appendChild(document.createElement("br")); 

       // On appelle Java 
       // Call Java. 
       javaObject.submit(); 
      }; 

      var initPos = 20; 

      // Le bloc vert bouge tout seul. 
      // The green block is moving. 
      var timer = setInterval(function() 
      { 
       initPos = initPos + 5; 

       document.getElementById("token").style.top = initPos + "px"; 

      }, 500); 
     }; 

    </script> 

</body> 
</html> 

메인 프레임 : QWebView에서 상속

public class WebBrowserTestFrame extends QMainWindow 
{ 
    protected QGraphicsView view; 
    protected QGraphicsScene scene; 
    protected WebBrowserTestQWebView browser; 
    protected QGridLayout gridLayout; 

    public WebBrowserTestFrame() 
    { 
     this.gridLayout = new QGridLayout(); 

     // Le widget où on affiche une image 
     // This widget displays an image 
     this.scene = new QGraphicsScene(); 
     QPixmap image = new QPixmap("resources/tests/Coin-coin.jpg"); 
     this.scene.addPixmap(image); 
     this.view = new QGraphicsView(scene); 

     // Le widget qui charge le fichier HTML 
     // This widget loads an HTML file 
     this.browser = new WebBrowserTestQWebView(this.view); 
     QPalette palette = this.browser.palette(); 
     palette.setBrush(QPalette.ColorRole.Base, new QBrush(new QColor(Qt.GlobalColor.transparent))); 
     this.browser.setPalette(palette); 
     this.browser.setAttribute(Qt.WidgetAttribute.WA_OpaquePaintEvent, false); 

     // On superpose les 2 widgets 
     // The 2 widgets are stacked 
     this.gridLayout.addWidget(this.view, 0, 0); 
     this.gridLayout.addWidget(this.browser, 0, 0); 

     // On attache le tout à la fenêtre principale 
     // Widgets are appended to the main frame 
     QWidget widget = new QWidget(); 
     widget.setLayout(this.gridLayout); 
     this.setCentralWidget(widget); 
     this.setWindowTitle("Hello WebKit"); 

     // Evénements de la Web view 
     // Web view events 
     this.browser.loadStarted.connect(this, "loadStarted()"); 
     this.browser.loadProgress.connect(this, "loadProgress(int)"); 
     this.browser.loadFinished.connect(this, "loadDone()"); 
     this.browser.urlChanged.connect(this, "urlChanged(QUrl)"); 

     // On charge la page 
     // Load the HTML file 
     QApplication.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       File htmlFile = new File("resources/interfaces/javascript/test.html"); 

       if (htmlFile.exists()) 
        browser.load(new QUrl("file://" + htmlFile.getAbsolutePath())); 
       else 
        System.out.println("Le fichier n'existe pas"); 
      } 
     }); 
    } 

    public void loadStarted() 
    { 
     System.out.println("Load started"); 
    } 

    public void loadDone() 
    { 
     WebBrowserTestJavascript javascript = new WebBrowserTestJavascript(); 
     this.browser.page().mainFrame().addToJavaScriptWindowObject("javaObject", javascript); 
     this.browser.page().mainFrame().evaluateJavaScript("fromJavaToJavascript()"); 
    } 

    public void loadProgress(int x) 
    { 
     System.out.println("Loading: " + x + " %"); 
    } 

    public void urlChanged(QUrl url) 
    { 
     System.out.println("Url changed : " + url); 
    } 
} 

등급 :

public class WebBrowserTestQWebView extends QWebView 
{ 
    @Override 
    public void paintEvent(QPaintEvent event) 
    { 
     // On tente d'effacer l'ancien affichage de la web view et c'est là que ça coince. 
     // Clears the previous web view rendering and here is the problem 
     QPainter painter = new QPainter(this); 
     painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source); 
     painter.fillRect(event.rect(), Qt.GlobalColor.transparent); 
     painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceOver); 

     super.paintEvent(event); 
    } 
} 

미리 감사드립니다. :)

답변

1

나는 마침내 해결책을 스스로 발견했다. 정말 간단했습니다. ^^ '

WebBrowserTestFrame 클래스에서 웹보기 배경을 투명하게 설정 한 코드를 제거하고 WebBrowserTestQWebView 클래스의 paintEvent 메서드에 넣었습니다. 좋아요 :

public class WebBrowserTestQWebView extends QWebView 
{ 
    @Override 
    public void paintEvent(QPaintEvent event) 
    { 
     QPalette palette = this.palette(); 
     palette.setBrush(QPalette.ColorRole.Base, new QBrush(new QColor(Qt.GlobalColor.transparent))); 
     this.setPalette(palette); 
     this.setAttribute(Qt.WidgetAttribute.WA_OpaquePaintEvent, false); 
     super.paintEvent(event); 
    } 
} 

그리고 내게 맞습니다! : D

Here is finally the expected rendering