Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Insert widget inside an other widget
Forum Updated to NodeBB v4.3 + New Features

Insert widget inside an other widget

Scheduled Pinned Locked Moved Solved Qt for Python
12 Posts 3 Posters 1.2k Views 1 Watching
  • 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi and welcome to devnet,

    Why are you putting a layout on a QListWidget ?

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    SangreSanS 1 Reply Last reply
    0
    • SGaistS SGaist

      Hi and welcome to devnet,

      Why are you putting a layout on a QListWidget ?

      SangreSanS Offline
      SangreSanS Offline
      SangreSan
      wrote on last edited by
      #3

      @SGaist i want to insert a QLineEdit and a button into QListWidget. Button is needed to add items to the QListWidget. QLineEdit is needed to search for items in QListWidget.

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #4

        It would be cleaner to put the line edit on top of the QListWidget and the add button under its bottom.

        QListWidget is typically a widget used within a layout and not with a layout on it.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        SangreSanS 1 Reply Last reply
        1
        • SGaistS SGaist

          It would be cleaner to put the line edit on top of the QListWidget and the add button under its bottom.

          QListWidget is typically a widget used within a layout and not with a layout on it.

          SangreSanS Offline
          SangreSanS Offline
          SangreSan
          wrote on last edited by
          #5

          @SGaist Your suggestion is logical, but I need the same design as in the picture.

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #6

            I that case you are likely better off by positioning them manually rather than in a widget. Use the resize event of your QTableWidget to position them correctly with regard to the size of it.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            SangreSanS 1 Reply Last reply
            0
            • SGaistS SGaist

              I that case you are likely better off by positioning them manually rather than in a widget. Use the resize event of your QTableWidget to position them correctly with regard to the size of it.

              SangreSanS Offline
              SangreSanS Offline
              SangreSan
              wrote on last edited by
              #7

              @SGaist I do not understand what you mean. Can you please give some example?

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #8

                Do not use a layout and position the widgets by hand using its geometry.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                SangreSanS 1 Reply Last reply
                0
                • SGaistS SGaist

                  Do not use a layout and position the widgets by hand using its geometry.

                  SangreSanS Offline
                  SangreSanS Offline
                  SangreSan
                  wrote on last edited by
                  #9

                  @SGaist well, i did it (i removed the layout), but this implementation also has graphic bugs.

                  class QList(QtWidgets.QListWidget):
                      def __init__(self, *args, **args2):
                          super(QList, self).__init__(*args, **args2)
                          self.button = QtWidgets.QPushButton('Test', parent=self)
                  
                      def resizeEvent(self, event):
                          self.button.move(100, 100)
                  
                  

                  Снимок экрана 2020-04-05 в 0.56.12.png

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    Don't forget to call the base class implementation of the methods you overload.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    1
                    • SangreSanS Offline
                      SangreSanS Offline
                      SangreSan
                      wrote on last edited by
                      #11

                      @Denni-0 It seems that I did such an implementation. but if it’s not difficult for you, show your implementation.

                      I also found another way using qgraphicsview:

                      from PyQt5.QtWidgets import (qApp,QMainWindow, QApplication,
                      QGraphicsScene,QGraphicsView, QListWidget, QLineEdit, QPushButton)
                      from PyQt5.QtCore import Qt,QRectF
                       
                       
                      class View(QMainWindow):
                          def __init__(self):
                              super().__init__()
                              self.scene = QGraphicsScene()
                              self.view = QGraphicsView(self.scene)
                              self.setCentralWidget(self.view)
                              lst = QListWidget()
                              lst.addItems([str(i) for i in range(100,200)])
                              lst.setAlternatingRowColors(True)
                              line = QLineEdit()
                              btn = QPushButton('+')
                              self.proxyList = self.scene.addWidget(lst)   
                              self.proxyLine = self.scene.addWidget(line)
                              self.proxyBtn = self.scene.addWidget(btn)
                          
                          def resizeEvent(self,e):
                              w,h = self.view.width(),self.view.height()
                              self.view.setSceneRect(0,0,w,h)
                              self.proxyList.setGeometry(QRectF(0,0,w,h))   
                              self.proxyLine.setGeometry(QRectF(w - 210,10,200,20)) 
                              self.proxyBtn.setGeometry(QRectF(w - 50,h - 30,20,20))
                       
                          def closeEvent(self,e):
                              qApp.quit()
                              
                      if __name__ == '__main__':
                          import sys
                          app = QApplication([])
                          w = View()
                          w.resize(800,600)
                          w.show()
                          sys.exit(app.exec_())
                      

                      This implementation has a boundary line around the button:
                      Снимок экрана 2020-04-05 в 22.44.36.png

                      SangreSanS 1 Reply Last reply
                      0
                      • SangreSanS SangreSan

                        @Denni-0 It seems that I did such an implementation. but if it’s not difficult for you, show your implementation.

                        I also found another way using qgraphicsview:

                        from PyQt5.QtWidgets import (qApp,QMainWindow, QApplication,
                        QGraphicsScene,QGraphicsView, QListWidget, QLineEdit, QPushButton)
                        from PyQt5.QtCore import Qt,QRectF
                         
                         
                        class View(QMainWindow):
                            def __init__(self):
                                super().__init__()
                                self.scene = QGraphicsScene()
                                self.view = QGraphicsView(self.scene)
                                self.setCentralWidget(self.view)
                                lst = QListWidget()
                                lst.addItems([str(i) for i in range(100,200)])
                                lst.setAlternatingRowColors(True)
                                line = QLineEdit()
                                btn = QPushButton('+')
                                self.proxyList = self.scene.addWidget(lst)   
                                self.proxyLine = self.scene.addWidget(line)
                                self.proxyBtn = self.scene.addWidget(btn)
                            
                            def resizeEvent(self,e):
                                w,h = self.view.width(),self.view.height()
                                self.view.setSceneRect(0,0,w,h)
                                self.proxyList.setGeometry(QRectF(0,0,w,h))   
                                self.proxyLine.setGeometry(QRectF(w - 210,10,200,20)) 
                                self.proxyBtn.setGeometry(QRectF(w - 50,h - 30,20,20))
                         
                            def closeEvent(self,e):
                                qApp.quit()
                                
                        if __name__ == '__main__':
                            import sys
                            app = QApplication([])
                            w = View()
                            w.resize(800,600)
                            w.show()
                            sys.exit(app.exec_())
                        

                        This implementation has a boundary line around the button:
                        Снимок экрана 2020-04-05 в 22.44.36.png

                        SangreSanS Offline
                        SangreSanS Offline
                        SangreSan
                        wrote on last edited by
                        #12

                        @SangreSan I solved the problem with displaying the button through setstylesheet:

                        QPushButton#addButton {
                            background-color: rgba(134, 134, 134, 0.3);
                            border-style: outset;
                            border-width: 2px;
                            border-color: rgba(20, 20, 20, 0.3);
                            color: white;
                        }
                         
                        QPushButton::pressed#addButton {
                            background-color: rgba(0, 0, 0, 0.3);
                            border-style: outset;
                            border-width: 2px;
                            border-color: rgba(20, 20, 20, 0.3);
                            color: white;
                        }
                        
                        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