Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QWindow, QWidget, Qt5, X11Embedding how?
QtWS25 Last Chance

QWindow, QWidget, Qt5, X11Embedding how?

Scheduled Pinned Locked Moved General and Desktop
41 Posts 5 Posters 29.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JKSHJ Offline
    JKSHJ Offline
    JKSH
    Moderators
    wrote on last edited by
    #28

    [quote author="Dcqt" date="1381690139"]I want the window size to be always equal to its parent i.e the widget on which the window is added.( here it is display 2nd arg in createWindowContainer).[/quote]It worked for me. When I change the parent's size, the embedded part changes size too.

    You manually changed lots of size settings with functions like setMinimumSize(), setMaximumSize(), and setSizePolicy(). Maybe they are affecting your window. Get rid of them and see what happens.

    [quote]I observed one thing, when the window is embedding its not embedding from top right corner always, some times coming in the middle , some times at mid left , and it does not cover all of its parent , covers only a portion of parent [/quote]I saw this too. I think it's a bug. Please file a bug report at http://bugreports.qt-project.org/ and provide a MINIMAL example -- you still have too many unnecessary functions, like setAutoFillBackground().

    [quote author="Dcqt" date="1381690139"][quote author="JKSH" date="1381680214"][quote]
    @
    window->show();
    @
    [/quote]
    No need to write this. When you show() display, all of its child widgets will also get shown. window is one of display's child widgets, because you put window in display's layout.[/quote]
    in my case if i dont write the window is not shown[/quote]Yes, you are right, sorry!

    [quote author="Dcqt" date="1381690139"]i have somany layouts and widgets may be i am doing some thing wrong...., but i am applying on the top widgets which is always visible[/quote]When you are trying something new, always try it with simple code first.

    If you use complicated examples, your life becomes very hard.

    [quote author="Dcqt" date="1381690139"]1) i get the below errors when running, what does it mean?
    QXcbConnection: XCB error: 8 (BadMatch), sequence: 230, resource id: 67108868, major code: 7 (ReparentWindow), minor code: 0
    QXcbConnection: XCB error: 8 (BadMatch), sequence: 265, resource id: 67108874, major code: 7 (ReparentWindow), minor code: 0
    QXcbConnection: XCB error: 8 (BadMatch), sequence: 272, resource id: 67108874, major code: 7 (ReparentWindow), minor code: 0[/quote]I'm not sure, sorry. Subscribe to the "Interest mailing list":http://lists.qt-project.org/mailman/listinfo/interest and ask there -- the list has more experienced people.

    [quote author="Dcqt" date="1381690139"]2) even after closing windows the process still runs, i had to forcely close the application[/quote]I think this is another bug; please report it too.

    As a workaround, you can force the parent widget to get destroyed when you close it, and force the app to quit when the widget is destroyed:

    @
    display->setAttribute(Qt::WA_DeleteOnClose);
    QObject::connect(display, SIGNAL(destroyed()), qApp, SLOT(quit()));
    @

    When you have filed your bug reports, please post the links here so that other people can follow the issue.

    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

    1 Reply Last reply
    0
    • D Offline
      D Offline
      Dcqt
      wrote on last edited by
      #29

      Sorry , that was my mistake.

      i was applying the layout repeatedly on the display , i understood this from the log when running......so thats why only for the first time the window will be displayed.

      i changed that part and some code clean up.

      below version is working perfectly fine , except for small problem.

      @
      void MainWindow::launch_app(int id)
      {
      WId winid = (WId) id;
      qDebug()<<"In launch_app win id is "<< id;
      QVBoxLayout *vl = new QVBoxLayout;
      display->setLayout(vl);

      window = createWindowContainer(QWindow::fromWinId(winid));
      vl -> addWidget(window);
       qDebug()<<"addWidget";
      

      }

      void MainWindow::finish(int,QProcess::ExitStatus)
      {
      qDebug()<<"finish";
      QLayout *lay = display->layout();
      delete lay;lay=NULL;
      }@

      and some where

      @
      void MainWindow::Launch_Test_exe()
      {
      ApplicationProcess = new QProcess();
      QString executable(TEST_EXE);
      connect(ApplicationProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(finish(int,QProcess::ExitStatus)));

      ApplicationProcess->start(executable, arguments);
      

      }
      @

      the problem is :

      when the window is embedded , it is some times displayed completely on display widget , and some times on a portion of it.
      I applied QPalette on the display and found it out. If i maximize the main window then it is covering all the display window.

      I applied following on the display..
      @
      display = new Window (min_width -KP_WIDTH ,min_height - (FP_HEIGHT + LW_HEIGHT),max_width - RWIDTH,max_height - (75 +FP_HEIGHT ) );
      display->setContentsMargins(0,0,0,0);
      display->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
      @

      1 Reply Last reply
      0
      • D Offline
        D Offline
        Dcqt
        wrote on last edited by
        #30

        [quote author="JKSH" date="1381770127"]
        I saw this too. I think it's a bug. Please file a bug report at http://bugreports.qt-project.org/ and provide a MINIMAL example -- you still have too many unnecessary functions, like setAutoFillBackground().[/quote]

        Sorry, i over looked...

        i will raise a bug report, but before that , i need to learn some x11 programming to embed widgets from one process to other.my people told me we have to use only Qt 5.0, as you know it does not support any of the above functions , so i have to rely on Native X11 library class.

        do you have any idea , any examples will be greatly appreciated .. :)

        I thank you a lot :)
        You are with me till my problem is solved , i have been trying to solve it for weeks

        1 Reply Last reply
        0
        • JKSHJ Offline
          JKSHJ Offline
          JKSH
          Moderators
          wrote on last edited by
          #31

          It's ok :) And you're welcome; do help others on the forum if you can!

          I'm quite curious -- if your team has just started to upgrade from Qt 4 to Qt 5, why did they choose Qt 5.0 and not Qt 5.1? Qt 5.1 has many bug fixes and new features, but is 100% compatible with Qt 5.0.

          I don't have X11 experience, unfortunately. Try searching for tutorials outside, like http://math.msu.su/~vvb/2course/Borisenko/CppProjects/GWindow/xintro.html

          Good luck

          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

          1 Reply Last reply
          0
          • P Offline
            P Offline
            pratap
            wrote on last edited by
            #32

            Hi all,

            Is anyone solved the problem as i am also facing similar problem.It will good if anyone can share replacement for qx11embedcontainer in qt 5.2.

            thanks

            1 Reply Last reply
            0
            • JKSHJ Offline
              JKSHJ Offline
              JKSH
              Moderators
              wrote on last edited by
              #33

              Hi,

              [quote author="pratap" date="1407410200"]Is anyone solved the problem as i am also facing similar problem.It will good if anyone can share replacement for qx11embedcontainer in qt 5.2.[/quote]Please read the previous posts in this thread. I posted examples on how to use QWindow::fromWinId() and QWidget::createWindowContainer() to replace QX11EmbedContainer.

              Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

              1 Reply Last reply
              0
              • P Offline
                P Offline
                pratap
                wrote on last edited by
                #34

                I have checked previous posts based on that i tried to use QWindow::fromWinId() and QWidget::createWindowContainer() but its not working for me .

                below is source code

                @int main(int argc, char *argv[])
                {
                QApplication app(argc, argv);

                QVBoxLayout *vl = new QVBoxLayout;
                
                QtQuick1ApplicationViewer viewer;
                viewer.addImportPath(QLatin1String("modules"));
                viewer.setOrientation(QtQuick1ApplicationViewer::ScreenOrientationAuto);
                viewer.setMainQmlFile&#40;QLatin1String("qml/testX11Embed/main.qml"&#41;&#41;;
                viewer.showExpanded();
                
                viewer.setLayout(vl);
                
                //getting the window id of thirdparty application
                
                system&#40; "xwininfo -int -name 'Navigation - India' |grep 'Window id: '| awk '{gsub(\"xwininfo: Window id: \", \"\"&#41;;print}' >> EmbeddingLogNavigation.txt"&#41; ;
                
                std::string sWiId;
                
                long int navigationWindowId;
                std::ifstream in("EmbeddingLogNavigation.txt");
                std::stringstream buffer;
                buffer << in.rdbuf();
                std::string contents(buffer.str());
                
                for( int i = 0 ; contents[i] != ' ' && contents[i] != '\0' ; ++i )
                    sWiId += contents[i];
                
                std::stringstream sstr(sWiId);
                
                sstr >> navigationWindowId;
                

                ////////////////////////////////////////////////

                QWidget navwidget;
                navwidget.setGeometry(0 ,0,2000 ,1000);
                navwidget.resize(500,500);
                navwidget.setPalette(QPalette(QColor(0,255,0,255)));
                navwidget.setAutoFillBackground(true);
                
                navwidget.createWindowContainer(QWindow::fromWinId(navigationWindowId));
                vl -> addWidget(&navwidget);
                navwidget.show();
                
                return app.exec&#40;&#41;;
                

                }
                @

                1 Reply Last reply
                0
                • JKSHJ Offline
                  JKSHJ Offline
                  JKSH
                  Moderators
                  wrote on last edited by
                  #35

                  [quote author="pratap" date="1407414917"]below is source code[/quote]Your code is too complex. Write something simpler -- don't include things that are not related to embedding.

                  [quote author="pratap" date="1407414917"]
                  @viewer.setLayout(vl);@
                  [/quote]The viewer already has its own layout. This line will break your viewer.

                  [quote author="pratap" date="1407414917"]
                  @
                  navwidget.createWindowContainer(QWindow::fromWinId(navigationWindowId));
                  vl -> addWidget(&navwidget);
                  navwidget.show();
                  @
                  [/quote]QWidget::createWindowContainer() is a static function that returns a pointer to your embedded window. You need to use this return value.
                  @
                  QWidget *emb = QWidget::createWindowContainer(QWindow::fromWinId(navigationWindowId));
                  emb->show();
                  @

                  Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    pratap
                    wrote on last edited by
                    #36

                    Thanks for reply.

                    I tried as you mentioned. But output is two separate windows one for viewer and one for navwidget.

                    bq. Your code is too complex. Write something simpler — don’t include things that are not related to embedding.

                    @int main(int argc, char *argv[])
                    {
                    QApplication app(argc, argv);

                    QVBoxLayout *vl = new QVBoxLayout;
                    
                    QtQuick1ApplicationViewer viewer;
                    viewer.addImportPath(QLatin1String("modules"));
                        viewer.setOrientation(QtQuick1ApplicationViewer::ScreenOrientationAuto);
                    viewer.setMainQmlFile&#40;QLatin1String("qml/testX11Embed/main.qml"&#41;);
                    viewer.showExpanded();
                    
                    long int navigationWindowId; // Window Id of navigation application
                    

                    // I have to embed this window into viewer window.I am able to get window id using system call.

                    // Code for embedding

                    QWidget *navwidget = QWidget::createWindowContainer(QWindow::fromWinId(navigationWindowId));
                    vl->addWidget(navwidget);
                    navwidget->show();

                    @
                    Output of this is two separate windows as mentioned above. Please guide me where i am doing wrong? i am using is default Qml project here provided by Qt creator(just for information).

                    1 Reply Last reply
                    0
                    • JKSHJ Offline
                      JKSHJ Offline
                      JKSH
                      Moderators
                      wrote on last edited by
                      #37

                      [quote]Output of this is two separate windows as mentioned above.[/quote]You need to put both widgets in the same layout, and embed the layout in a blank widget.

                      @
                      QtQuick1ApplicationViewer *viewer = new QtQuick1ApplicationViewer;
                      // (Initialize the viewer)
                      // ...

                      QWidget *navwidget = QWidget::createWindowContainer(QWindow::fromWinId(navigationWindowId));

                      QVBoxLayout *vl = new QVBoxLayout;
                      vl->addWidget(viewer);
                      vl->addWidget(navwidget);

                      QWidget w;
                      w.setLayout(vl);
                      w.show();
                      @

                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        pratap
                        wrote on last edited by
                        #38

                        Thanks for helping me but its not working for me.I am getting following errors.

                        QXcbConnection: XCB error: 3 (BadWindow), sequence: 250, resource id: 60817411, major code: 18 (ChangeProperty), minor code: 0
                        QXcbConnection: XCB error: 3 (BadWindow), sequence: 332, resource id: 60817411, major code: 7 (ReparentWindow), minor code: 0
                        QXcbConnection: XCB error: 3 (BadWindow), sequence: 334, resource id: 60817411, major code: 8 (MapWindow), minor code: 0
                        QXcbConnection: XCB error: 3 (BadWindow), sequence: 367, resource id: 60817411, major code: 18 (ChangeProperty), minor code: 0
                        QXcbConnection: XCB error: 3 (BadWindow), sequence: 368, resource id: 60817411, major code: 12 (ConfigureWindow), minor code: 0

                        I am clueless where i am doing wrong.If you can share any example code will be great help.

                        1 Reply Last reply
                        0
                        • JKSHJ Offline
                          JKSHJ Offline
                          JKSH
                          Moderators
                          wrote on last edited by
                          #39

                          [quote author="pratap" date="1407502698"]Thanks for helping me but its not working for me.I am getting following errors.

                          QXcbConnection: XCB error: 3 (BadWindow), sequence: 250, resource id: 60817411, major code: 18 (ChangeProperty), minor code: 0
                          QXcbConnection: XCB error: 3 (BadWindow), sequence: 332, resource id: 60817411, major code: 7 (ReparentWindow), minor code: 0
                          QXcbConnection: XCB error: 3 (BadWindow), sequence: 334, resource id: 60817411, major code: 8 (MapWindow), minor code: 0
                          QXcbConnection: XCB error: 3 (BadWindow), sequence: 367, resource id: 60817411, major code: 18 (ChangeProperty), minor code: 0
                          QXcbConnection: XCB error: 3 (BadWindow), sequence: 368, resource id: 60817411, major code: 12 (ConfigureWindow), minor code: 0
                          [/quote]Have you checked the value of your Window ID? Is it correct?

                          [quote]I am clueless where i am doing wrong.If you can share any example code will be great help.[/quote]Huh? I've posted so many pieces of code in this thread

                          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                          1 Reply Last reply
                          0
                          • P Offline
                            P Offline
                            pratap
                            wrote on last edited by
                            #40

                            Yes window ID is correct. I am able to embed Qml into Qt widget but other way it is not happening. I am getting errors as mentioned above.

                            1 Reply Last reply
                            0
                            • _ Offline
                              _ Offline
                              _Rayman_
                              wrote on last edited by
                              #41

                              I'd like to jump into this topic. I'm currently migrating our Qt4 code that heavily relies on window embedding to Qt 5.3.

                              In Qt 4 the classes QX11EmbedContainer and QX11EmbedWidget exposed several signals such as void clientClosed (), void clientIsEmbedded (), void containerClosed () etc.

                              The new mechanism in Qt5 doesn't have those signals. What are the signal equivalents in Qt5 to get informed when a client has been embedded or closed?

                              Thanks!

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved