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. QPushButton does not work
Forum Updated to NodeBB v4.3 + New Features

QPushButton does not work

Scheduled Pinned Locked Moved Solved General and Desktop
14 Posts 3 Posters 1.9k 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.
  • C Offline
    C Offline
    ChrisW67
    wrote on last edited by
    #2

    The only idea we can have is that it is programmed incorrectly. Unless we can see your actual code, or a minimal example that displays the problem, and some basic information about the environment it runs in then there is not much that can be done to help.

    1 Reply Last reply
    1
    • B Offline
      B Offline
      botqe
      wrote on last edited by
      #3

      Hey Chris!

      Thanks for replying back. This is the code for the menu which changes to other widgets. I have two buttons on the menu page which when I click on them, I'm able to move to the widget. But none of the buttons work. If you need anything else, please tell me.

      import os
      import sys
      from PyQt5 import uic
      from PyQt5.QtCore import Qt
      from PyQt5.QtWidgets import QStackedWidget, QApplication
      from PyQt5 import QtGui
      
      
      class MainWindow(QStackedWidget):
          def __init__(self):
              super().__init__()
              uic.loadUi(os.path.join('ui_files', 'ciri.ui'), self)
              self.setWindowIcon(QtGui.QIcon(os.path.join('images', 'rabbit.png')))
              self.open = None
              self.setCurrentIndex(0)
              self.setAttribute(Qt.WA_TranslucentBackground)
      
              self.show()
      
              self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
              self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
      
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          app.setApplicationName('Ciri')
          window = MainWindow()
          window.show()
          sys.exit(app.exec())
      
      
      JonBJ 1 Reply Last reply
      0
      • B botqe

        Hey Chris!

        Thanks for replying back. This is the code for the menu which changes to other widgets. I have two buttons on the menu page which when I click on them, I'm able to move to the widget. But none of the buttons work. If you need anything else, please tell me.

        import os
        import sys
        from PyQt5 import uic
        from PyQt5.QtCore import Qt
        from PyQt5.QtWidgets import QStackedWidget, QApplication
        from PyQt5 import QtGui
        
        
        class MainWindow(QStackedWidget):
            def __init__(self):
                super().__init__()
                uic.loadUi(os.path.join('ui_files', 'ciri.ui'), self)
                self.setWindowIcon(QtGui.QIcon(os.path.join('images', 'rabbit.png')))
                self.open = None
                self.setCurrentIndex(0)
                self.setAttribute(Qt.WA_TranslucentBackground)
        
                self.show()
        
                self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
        
        
        if __name__ == '__main__':
            app = QApplication(sys.argv)
            app.setApplicationName('Ciri')
            window = MainWindow()
            window.show()
            sys.exit(app.exec())
        
        
        JonBJ Online
        JonBJ Online
        JonB
        wrote on last edited by JonB
        #4

        @botqe
        There is nothing here to show where these buttons are. I guess since your whole main window is a QStackedWidget you have one button on each page? "I have two buttons on the menu page" --- what is a "menu page"? Show the content of the .ui file. " I cannot run the segment which is supposed to run after button is pressed." --- what is a "segment" that is supposed to run after a button is pressed?

        B 1 Reply Last reply
        1
        • JonBJ JonB

          @botqe
          There is nothing here to show where these buttons are. I guess since your whole main window is a QStackedWidget you have one button on each page? "I have two buttons on the menu page" --- what is a "menu page"? Show the content of the .ui file. " I cannot run the segment which is supposed to run after button is pressed." --- what is a "segment" that is supposed to run after a button is pressed?

          B Offline
          B Offline
          botqe
          wrote on last edited by botqe
          #5

          @JonB That was the code for the following page (menu page):

          alt text

          When I click on "Hide" or "Reveal", it works fine and I move to the next page of stacked widget which is the following:

          alt text

          When I click on select file, it does not run the code segment which is supposed to open file manager (But if I run the separate file for the next page by itself, button works). I tried copying ui file but its too long and because of length limitation, it does not allow me to copy it.

          I have copied a piece of code to understand what open file code segment looks like:

          class Embed(QStackedWidget):
              def __init__(self):
                  super(Embed, self).__init__()
                  uic.loadUi(os.path.join('ui_files', 'ciri.ui'), self)
                  self.setWindowIcon(QtGui.QIcon(os.path.join('images', 'rabbit.png')))
                  self.setCurrentIndex(2)
                  self.show()
          
                  self.selected_carrier = None
                  self.saved = None
                  self.open = None
                  self.input_file = None
                  self.b_pass = None
          
                  self.selectFileButton.clicked.connect(self.open_file)
                  self.selectCarrierButton.clicked.connect(self.open_carrier)
                  self.encryptButton.clicked.connect(self.set_password)
                  self.embedButton.clicked.connect(self.embed_it)
          
              def open_file(self):
                  try:
                      selected_file = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
                      with open(selected_file[0], 'rb') as inf:
                          self.input_file = inf.read()
                  except Exception as e:
                      print(e)
          
          1 Reply Last reply
          0
          • C Offline
            C Offline
            ChrisW67
            wrote on last edited by ChrisW67
            #6

            Ok, I am going to assume that the second page of the MainWindow stacked widget is an instance of the Embed class. The embed class is also a QStackedWidget. Did you intend to have nested QStackedWidgets (that would be an odd arrangement) ?

            In general, QWidget::show() would not normally be called in the constructor of the widget. This should definitely be removed from both class constructors. For pages in a stacked widget, visibility or otherwise is determined exclusively by the containing QStackedWidget. For the main application window(s) the QWidget::show() would typical be in the main() (as it is in your Python).

            Both MainWindow and Embed classes load the same UI file, yet your screen shots are different. Bit confusing.

            This is what I think your program could look like:

            ### main.py
            
            import os
            import sys
            from PyQt5.QtWidgets import QApplication
            
            from mainwindow import MainWindow
            
            if __name__ == '__main__':
                app = QApplication(sys.argv)
                app.setApplicationName('Ciri')
                window = MainWindow()
                window.show()
                sys.exit(app.exec())
            
            ### mainwindow.py
            
            import os
            import sys
            from PyQt5 import uic
            from PyQt5.QtCore import Qt
            from PyQt5.QtWidgets import QStackedWidget, QApplication
            from PyQt5 import QtGui
            
            class MainWindow(QStackedWidget):
                def __init__(self):
                    super(MainWindow, self).__init__()
                    ui = uic.loadUi('mainwindow.ui', self)
            
                    self.setCurrentIndex(0)
            
                    self.menuPage.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                    self.menuPage.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
            
            ### menu.py
            
            from PyQt5 import uic
            from PyQt5.QtCore import Qt
            from PyQt5.QtWidgets import QWidget
            from PyQt5 import QtGui
            
            class Menu(QWidget):
                def __init__(self):
                    super(Menu, self).__init__()
                    uic.loadUi('menu.ui', self)
            
            ### extract.py
            
            from PyQt5 import uic
            from PyQt5.QtCore import Qt
            from PyQt5.QtWidgets import QWidget
            from PyQt5 import QtGui
            
            class Extract(QWidget):
                def __init__(self):
                    super(Extract, self).__init__()
                    uic.loadUi('extract.ui', self)
            
            ### embed.py
            
            from PyQt5 import uic
            from PyQt5.QtCore import Qt
            from PyQt5.QtWidgets import QWidget, QFileDialog
            from PyQt5 import QtGui
            
            class Embed(QWidget):
                def __init__(self):
                    super(Embed, self).__init__()
                    uic.loadUi('embed.ui', self)
            
                    self.selected_carrier = None
                    self.saved = None
                    self.open = None
                    self.input_file = None
                    self.b_pass = None
            
                    self.selectFileButton.clicked.connect(self.open_file)
                    #self.selectCarrierButton.clicked.connect(self.open_carrier)
                    #self.encryptButton.clicked.connect(self.set_password)
                    #self.embedButton.clicked.connect(self.embed_it)
            
                def open_file(self):
                    try:
                        selected_file = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
                        with open(selected_file[0], 'rb') as inf:
                            self.input_file = inf.read()
                    except Exception as e:
                        print(e)
            
            ### mainwindow.ui
            
            <?xml version="1.0" encoding="UTF-8"?>
            <ui version="4.0">
             <class>stackedWidget</class>
             <widget class="QStackedWidget" name="stackedWidget">
              <property name="geometry">
               <rect>
                <x>0</x>
                <y>0</y>
                <width>503</width>
                <height>419</height>
               </rect>
              </property>
              <property name="windowTitle">
               <string>StackedWidget</string>
              </property>
              <widget class="Menu" name="menuPage"/>
              <widget class="Extract" name="extractPage"/>
              <widget class="Embed" name="embedPage"/>
             </widget>
             <customwidgets>
              <customwidget>
               <class>Embed</class>
               <extends>QWidget</extends>
               <header>embed.h</header>
               <container>1</container>
              </customwidget>
              <customwidget>
               <class>Extract</class>
               <extends>QWidget</extends>
               <header>extract.h</header>
               <container>1</container>
              </customwidget>
              <customwidget>
               <class>Menu</class>
               <extends>QWidget</extends>
               <header>menu.h</header>
               <container>1</container>
              </customwidget>
             </customwidgets>
             <resources/>
             <connections/>
            </ui>
            
            ### menu.ui
            
            <?xml version="1.0" encoding="UTF-8"?>
            <ui version="4.0">
             <class>Form</class>
             <widget class="QWidget" name="Form">
              <property name="geometry">
               <rect>
                <x>0</x>
                <y>0</y>
                <width>400</width>
                <height>300</height>
               </rect>
              </property>
              <property name="windowTitle">
               <string>Form</string>
              </property>
              <layout class="QVBoxLayout" name="verticalLayout">
               <item>
                <widget class="QPushButton" name="hideButton">
                 <property name="text">
                  <string>Hide</string>
                 </property>
                </widget>
               </item>
               <item>
                <widget class="QPushButton" name="revealButton">
                 <property name="text">
                  <string>Reveal</string>
                 </property>
                </widget>
               </item>
              </layout>
             </widget>
             <resources/>
             <connections/>
            </ui>
            
            ### extract.ui
            
            <?xml version="1.0" encoding="UTF-8"?>
            <ui version="4.0">
             <class>Form</class>
             <widget class="QWidget" name="Form">
              <property name="geometry">
               <rect>
                <x>0</x>
                <y>0</y>
                <width>400</width>
                <height>300</height>
               </rect>
              </property>
              <property name="windowTitle">
               <string>Form</string>
              </property>
             </widget>
             <resources/>
             <connections/>
            </ui>
            
            ### embed.ui
            
            <?xml version="1.0" encoding="UTF-8"?>
            <ui version="4.0">
             <class>Form</class>
             <widget class="QWidget" name="Form">
              <property name="geometry">
               <rect>
                <x>0</x>
                <y>0</y>
                <width>400</width>
                <height>300</height>
               </rect>
              </property>
              <property name="windowTitle">
               <string>Form</string>
              </property>
              <layout class="QVBoxLayout" name="verticalLayout">
               <item>
                <widget class="QPushButton" name="selectFileButton">
                 <property name="text">
                  <string>Select File</string>
                 </property>
                </widget>
               </item>
               <item>
                <widget class="QPushButton" name="selectCarrierButton">
                 <property name="text">
                  <string>Select Carrier</string>
                 </property>
                </widget>
               </item>
               <item>
                <widget class="QPushButton" name="encryptButton">
                 <property name="text">
                  <string>Set Password</string>
                 </property>
                </widget>
               </item>
               <item>
                <widget class="QPushButton" name="embedButton">
                 <property name="text">
                  <string>Embed</string>
                 </property>
                </widget>
               </item>
              </layout>
             </widget>
             <resources/>
             <connections/>
            </ui>
            
            B 1 Reply Last reply
            0
            • C ChrisW67

              Ok, I am going to assume that the second page of the MainWindow stacked widget is an instance of the Embed class. The embed class is also a QStackedWidget. Did you intend to have nested QStackedWidgets (that would be an odd arrangement) ?

              In general, QWidget::show() would not normally be called in the constructor of the widget. This should definitely be removed from both class constructors. For pages in a stacked widget, visibility or otherwise is determined exclusively by the containing QStackedWidget. For the main application window(s) the QWidget::show() would typical be in the main() (as it is in your Python).

              Both MainWindow and Embed classes load the same UI file, yet your screen shots are different. Bit confusing.

              This is what I think your program could look like:

              ### main.py
              
              import os
              import sys
              from PyQt5.QtWidgets import QApplication
              
              from mainwindow import MainWindow
              
              if __name__ == '__main__':
                  app = QApplication(sys.argv)
                  app.setApplicationName('Ciri')
                  window = MainWindow()
                  window.show()
                  sys.exit(app.exec())
              
              ### mainwindow.py
              
              import os
              import sys
              from PyQt5 import uic
              from PyQt5.QtCore import Qt
              from PyQt5.QtWidgets import QStackedWidget, QApplication
              from PyQt5 import QtGui
              
              class MainWindow(QStackedWidget):
                  def __init__(self):
                      super(MainWindow, self).__init__()
                      ui = uic.loadUi('mainwindow.ui', self)
              
                      self.setCurrentIndex(0)
              
                      self.menuPage.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                      self.menuPage.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
              
              ### menu.py
              
              from PyQt5 import uic
              from PyQt5.QtCore import Qt
              from PyQt5.QtWidgets import QWidget
              from PyQt5 import QtGui
              
              class Menu(QWidget):
                  def __init__(self):
                      super(Menu, self).__init__()
                      uic.loadUi('menu.ui', self)
              
              ### extract.py
              
              from PyQt5 import uic
              from PyQt5.QtCore import Qt
              from PyQt5.QtWidgets import QWidget
              from PyQt5 import QtGui
              
              class Extract(QWidget):
                  def __init__(self):
                      super(Extract, self).__init__()
                      uic.loadUi('extract.ui', self)
              
              ### embed.py
              
              from PyQt5 import uic
              from PyQt5.QtCore import Qt
              from PyQt5.QtWidgets import QWidget, QFileDialog
              from PyQt5 import QtGui
              
              class Embed(QWidget):
                  def __init__(self):
                      super(Embed, self).__init__()
                      uic.loadUi('embed.ui', self)
              
                      self.selected_carrier = None
                      self.saved = None
                      self.open = None
                      self.input_file = None
                      self.b_pass = None
              
                      self.selectFileButton.clicked.connect(self.open_file)
                      #self.selectCarrierButton.clicked.connect(self.open_carrier)
                      #self.encryptButton.clicked.connect(self.set_password)
                      #self.embedButton.clicked.connect(self.embed_it)
              
                  def open_file(self):
                      try:
                          selected_file = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
                          with open(selected_file[0], 'rb') as inf:
                              self.input_file = inf.read()
                      except Exception as e:
                          print(e)
              
              ### mainwindow.ui
              
              <?xml version="1.0" encoding="UTF-8"?>
              <ui version="4.0">
               <class>stackedWidget</class>
               <widget class="QStackedWidget" name="stackedWidget">
                <property name="geometry">
                 <rect>
                  <x>0</x>
                  <y>0</y>
                  <width>503</width>
                  <height>419</height>
                 </rect>
                </property>
                <property name="windowTitle">
                 <string>StackedWidget</string>
                </property>
                <widget class="Menu" name="menuPage"/>
                <widget class="Extract" name="extractPage"/>
                <widget class="Embed" name="embedPage"/>
               </widget>
               <customwidgets>
                <customwidget>
                 <class>Embed</class>
                 <extends>QWidget</extends>
                 <header>embed.h</header>
                 <container>1</container>
                </customwidget>
                <customwidget>
                 <class>Extract</class>
                 <extends>QWidget</extends>
                 <header>extract.h</header>
                 <container>1</container>
                </customwidget>
                <customwidget>
                 <class>Menu</class>
                 <extends>QWidget</extends>
                 <header>menu.h</header>
                 <container>1</container>
                </customwidget>
               </customwidgets>
               <resources/>
               <connections/>
              </ui>
              
              ### menu.ui
              
              <?xml version="1.0" encoding="UTF-8"?>
              <ui version="4.0">
               <class>Form</class>
               <widget class="QWidget" name="Form">
                <property name="geometry">
                 <rect>
                  <x>0</x>
                  <y>0</y>
                  <width>400</width>
                  <height>300</height>
                 </rect>
                </property>
                <property name="windowTitle">
                 <string>Form</string>
                </property>
                <layout class="QVBoxLayout" name="verticalLayout">
                 <item>
                  <widget class="QPushButton" name="hideButton">
                   <property name="text">
                    <string>Hide</string>
                   </property>
                  </widget>
                 </item>
                 <item>
                  <widget class="QPushButton" name="revealButton">
                   <property name="text">
                    <string>Reveal</string>
                   </property>
                  </widget>
                 </item>
                </layout>
               </widget>
               <resources/>
               <connections/>
              </ui>
              
              ### extract.ui
              
              <?xml version="1.0" encoding="UTF-8"?>
              <ui version="4.0">
               <class>Form</class>
               <widget class="QWidget" name="Form">
                <property name="geometry">
                 <rect>
                  <x>0</x>
                  <y>0</y>
                  <width>400</width>
                  <height>300</height>
                 </rect>
                </property>
                <property name="windowTitle">
                 <string>Form</string>
                </property>
               </widget>
               <resources/>
               <connections/>
              </ui>
              
              ### embed.ui
              
              <?xml version="1.0" encoding="UTF-8"?>
              <ui version="4.0">
               <class>Form</class>
               <widget class="QWidget" name="Form">
                <property name="geometry">
                 <rect>
                  <x>0</x>
                  <y>0</y>
                  <width>400</width>
                  <height>300</height>
                 </rect>
                </property>
                <property name="windowTitle">
                 <string>Form</string>
                </property>
                <layout class="QVBoxLayout" name="verticalLayout">
                 <item>
                  <widget class="QPushButton" name="selectFileButton">
                   <property name="text">
                    <string>Select File</string>
                   </property>
                  </widget>
                 </item>
                 <item>
                  <widget class="QPushButton" name="selectCarrierButton">
                   <property name="text">
                    <string>Select Carrier</string>
                   </property>
                  </widget>
                 </item>
                 <item>
                  <widget class="QPushButton" name="encryptButton">
                   <property name="text">
                    <string>Set Password</string>
                   </property>
                  </widget>
                 </item>
                 <item>
                  <widget class="QPushButton" name="embedButton">
                   <property name="text">
                    <string>Embed</string>
                   </property>
                  </widget>
                 </item>
                </layout>
               </widget>
               <resources/>
               <connections/>
              </ui>
              
              B Offline
              B Offline
              botqe
              wrote on last edited by botqe
              #7

              @ChrisW67 To be honest, the previous version of the application had different .ui files for each page and it worked fine. But I decided to have one .ui file (stackedwidget) and change between pages. This is why the code seems a bit confusing. So instead of having multiple ui files for each separate python file, I combined them into one using Qt Designer and Qstackedwidget. Right now, if I decided to change back to multiple ui files (one for each page), qpushbutton works well but in this code, it doesn't. If it was a problem of loading ui file, the graphics would not load. I'm able to move between pages as well, but when I move to another page, clicking on qpushbutton does not work...

              C JonBJ 2 Replies Last reply
              0
              • B botqe

                @ChrisW67 To be honest, the previous version of the application had different .ui files for each page and it worked fine. But I decided to have one .ui file (stackedwidget) and change between pages. This is why the code seems a bit confusing. So instead of having multiple ui files for each separate python file, I combined them into one using Qt Designer and Qstackedwidget. Right now, if I decided to change back to multiple ui files (one for each page), qpushbutton works well but in this code, it doesn't. If it was a problem of loading ui file, the graphics would not load. I'm able to move between pages as well, but when I move to another page, clicking on qpushbutton does not work...

                C Offline
                C Offline
                ChrisW67
                wrote on last edited by
                #8

                @botqe So what you have is more like this?

                ### main.py
                
                import os
                import sys
                from PyQt5.QtWidgets import QApplication
                
                from mainwindow import MainWindow
                
                if __name__ == '__main__':
                    app = QApplication(sys.argv)
                    app.setApplicationName('Ciri')
                    window = MainWindow()
                    window.show()
                    sys.exit(app.exec())
                
                ### mainwindow.py
                
                import os
                import sys
                from PyQt5 import uic
                from PyQt5.QtCore import Qt
                from PyQt5.QtWidgets import QApplication, QStackedWidget, QFileDialog
                from PyQt5 import QtGui
                
                class MainWindow(QStackedWidget):
                    def __init__(self):
                        super(MainWindow, self).__init__()
                        ui = uic.loadUi('mainwindow.ui', self)
                
                        self.selected_carrier = None
                        self.saved = None
                        self.open = None
                        self.input_file = None
                        self.b_pass = None
                
                        self.setCurrentIndex(0)
                
                        # Menu Page
                        self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                        self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
                       
                        # Embed Page
                        self.selectFileButton.clicked.connect(self.open_file)
                        self.selectCarrierButton.clicked.connect(self.open_carrier)
                        self.encryptButton.clicked.connect(self.set_password)
                        self.embedButton.clicked.connect(self.embed_it)
                
                    def open_file(self):
                        try:
                            selected_file = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
                            with open(selected_file[0], 'rb') as inf:
                                self.input_file = inf.read()
                        except Exception as e:
                            print(e)
                
                    def open_carrier(self):
                        print("open_carrier")
                
                    def set_password(self):
                        print("set_password")
                
                    def embed_it(self):
                        print("embed_it")
                
                ### mainwindouw.ui
                
                <?xml version="1.0" encoding="UTF-8"?>
                <ui version="4.0">
                 <class>stackedWidget</class>
                 <widget class="QStackedWidget" name="stackedWidget">
                  <property name="geometry">
                   <rect>
                    <x>0</x>
                    <y>0</y>
                    <width>503</width>
                    <height>419</height>
                   </rect>
                  </property>
                  <property name="windowTitle">
                   <string>Ciri</string>
                  </property>
                  <property name="currentIndex">
                   <number>2</number>
                  </property>
                  <widget class="QWidget" name="menuPage">
                   <layout class="QVBoxLayout" name="verticalLayout">
                    <item>
                     <widget class="QPushButton" name="hideButton">
                      <property name="text">
                       <string>Hide</string>
                      </property>
                     </widget>
                    </item>
                    <item>
                     <widget class="QPushButton" name="revealButton">
                      <property name="text">
                       <string>Reveal</string>
                      </property>
                     </widget>
                    </item>
                   </layout>
                  </widget>
                  <widget class="QWidget" name="extractPage">
                   <layout class="QVBoxLayout" name="verticalLayout_3">
                    <item>
                     <widget class="QLabel" name="label">
                      <property name="text">
                       <string>Empty</string>
                      </property>
                     </widget>
                    </item>
                   </layout>
                  </widget>
                  <widget class="QWidget" name="embedPage">
                   <layout class="QVBoxLayout" name="verticalLayout_2">
                    <item>
                     <widget class="QPushButton" name="selectFileButton">
                      <property name="text">
                       <string>Select File</string>
                      </property>
                     </widget>
                    </item>
                    <item>
                     <widget class="QPushButton" name="selectCarrierButton">
                      <property name="text">
                       <string>Select Carrier</string>
                      </property>
                     </widget>
                    </item>
                    <item>
                     <widget class="QPushButton" name="encryptButton">
                      <property name="text">
                       <string>Set Password</string>
                      </property>
                     </widget>
                    </item>
                    <item>
                     <widget class="QPushButton" name="embedButton">
                      <property name="text">
                       <string>Embed</string>
                      </property>
                     </widget>
                    </item>
                   </layout>
                  </widget>
                 </widget>
                 <resources/>
                 <connections/>
                </ui>
                

                This works, right?

                B 1 Reply Last reply
                0
                • C ChrisW67

                  @botqe So what you have is more like this?

                  ### main.py
                  
                  import os
                  import sys
                  from PyQt5.QtWidgets import QApplication
                  
                  from mainwindow import MainWindow
                  
                  if __name__ == '__main__':
                      app = QApplication(sys.argv)
                      app.setApplicationName('Ciri')
                      window = MainWindow()
                      window.show()
                      sys.exit(app.exec())
                  
                  ### mainwindow.py
                  
                  import os
                  import sys
                  from PyQt5 import uic
                  from PyQt5.QtCore import Qt
                  from PyQt5.QtWidgets import QApplication, QStackedWidget, QFileDialog
                  from PyQt5 import QtGui
                  
                  class MainWindow(QStackedWidget):
                      def __init__(self):
                          super(MainWindow, self).__init__()
                          ui = uic.loadUi('mainwindow.ui', self)
                  
                          self.selected_carrier = None
                          self.saved = None
                          self.open = None
                          self.input_file = None
                          self.b_pass = None
                  
                          self.setCurrentIndex(0)
                  
                          # Menu Page
                          self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                          self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
                         
                          # Embed Page
                          self.selectFileButton.clicked.connect(self.open_file)
                          self.selectCarrierButton.clicked.connect(self.open_carrier)
                          self.encryptButton.clicked.connect(self.set_password)
                          self.embedButton.clicked.connect(self.embed_it)
                  
                      def open_file(self):
                          try:
                              selected_file = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt)')
                              with open(selected_file[0], 'rb') as inf:
                                  self.input_file = inf.read()
                          except Exception as e:
                              print(e)
                  
                      def open_carrier(self):
                          print("open_carrier")
                  
                      def set_password(self):
                          print("set_password")
                  
                      def embed_it(self):
                          print("embed_it")
                  
                  ### mainwindouw.ui
                  
                  <?xml version="1.0" encoding="UTF-8"?>
                  <ui version="4.0">
                   <class>stackedWidget</class>
                   <widget class="QStackedWidget" name="stackedWidget">
                    <property name="geometry">
                     <rect>
                      <x>0</x>
                      <y>0</y>
                      <width>503</width>
                      <height>419</height>
                     </rect>
                    </property>
                    <property name="windowTitle">
                     <string>Ciri</string>
                    </property>
                    <property name="currentIndex">
                     <number>2</number>
                    </property>
                    <widget class="QWidget" name="menuPage">
                     <layout class="QVBoxLayout" name="verticalLayout">
                      <item>
                       <widget class="QPushButton" name="hideButton">
                        <property name="text">
                         <string>Hide</string>
                        </property>
                       </widget>
                      </item>
                      <item>
                       <widget class="QPushButton" name="revealButton">
                        <property name="text">
                         <string>Reveal</string>
                        </property>
                       </widget>
                      </item>
                     </layout>
                    </widget>
                    <widget class="QWidget" name="extractPage">
                     <layout class="QVBoxLayout" name="verticalLayout_3">
                      <item>
                       <widget class="QLabel" name="label">
                        <property name="text">
                         <string>Empty</string>
                        </property>
                       </widget>
                      </item>
                     </layout>
                    </widget>
                    <widget class="QWidget" name="embedPage">
                     <layout class="QVBoxLayout" name="verticalLayout_2">
                      <item>
                       <widget class="QPushButton" name="selectFileButton">
                        <property name="text">
                         <string>Select File</string>
                        </property>
                       </widget>
                      </item>
                      <item>
                       <widget class="QPushButton" name="selectCarrierButton">
                        <property name="text">
                         <string>Select Carrier</string>
                        </property>
                       </widget>
                      </item>
                      <item>
                       <widget class="QPushButton" name="encryptButton">
                        <property name="text">
                         <string>Set Password</string>
                        </property>
                       </widget>
                      </item>
                      <item>
                       <widget class="QPushButton" name="embedButton">
                        <property name="text">
                         <string>Embed</string>
                        </property>
                       </widget>
                      </item>
                     </layout>
                    </widget>
                   </widget>
                   <resources/>
                   <connections/>
                  </ui>
                  

                  This works, right?

                  B Offline
                  B Offline
                  botqe
                  wrote on last edited by
                  #9

                  @ChrisW67 This is my code for menu page (1st image: eyes) from which I move to other pages:

                  class MainWindow(QStackedWidget):
                      def __init__(self):
                          super().__init__()
                          uic.loadUi(os.path.join('ui_files', 'ciri.ui'), self)
                          self.setWindowIcon(QtGui.QIcon(os.path.join('images', 'rabbit_small.png')))
                          self.open = None
                          self.setCurrentIndex(0)
                          self.setAttribute(Qt.WA_TranslucentBackground)
                  
                          self.show()
                  
                          self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                          self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
                  
                  
                  if __name__ == '__main__':
                      app = QApplication(sys.argv)
                      app.setApplicationName('Ciri')
                      window = MainWindow()
                      window.show()
                      sys.exit(app.exec())
                  
                  

                  This works well. Buttons and everything. But when I click on button to change widget and move to other ones, buttons on other pages do not work.

                  C 1 Reply Last reply
                  0
                  • B botqe

                    @ChrisW67 This is my code for menu page (1st image: eyes) from which I move to other pages:

                    class MainWindow(QStackedWidget):
                        def __init__(self):
                            super().__init__()
                            uic.loadUi(os.path.join('ui_files', 'ciri.ui'), self)
                            self.setWindowIcon(QtGui.QIcon(os.path.join('images', 'rabbit_small.png')))
                            self.open = None
                            self.setCurrentIndex(0)
                            self.setAttribute(Qt.WA_TranslucentBackground)
                    
                            self.show()
                    
                            self.revealButton.clicked.connect(lambda: self.setCurrentWidget(self.extractPage))
                            self.hideButton.clicked.connect(lambda: self.setCurrentWidget(self.embedPage))
                    
                    
                    if __name__ == '__main__':
                        app = QApplication(sys.argv)
                        app.setApplicationName('Ciri')
                        window = MainWindow()
                        window.show()
                        sys.exit(app.exec())
                    
                    

                    This works well. Buttons and everything. But when I click on button to change widget and move to other ones, buttons on other pages do not work.

                    C Offline
                    C Offline
                    ChrisW67
                    wrote on last edited by
                    #10

                    If ciri.ui is the entire UI with all the widgets composed into a QStackedWidget then all the QPushButton instances exist in the MainWindow object scope (as in my example). The code you just posted connects only the Reveal and Hide buttons, so I do not know how you expect the other buttons to do anything.

                    Does my three file example work for you or not?

                    B 1 Reply Last reply
                    0
                    • C ChrisW67

                      If ciri.ui is the entire UI with all the widgets composed into a QStackedWidget then all the QPushButton instances exist in the MainWindow object scope (as in my example). The code you just posted connects only the Reveal and Hide buttons, so I do not know how you expect the other buttons to do anything.

                      Does my three file example work for you or not?

                      B Offline
                      B Offline
                      botqe
                      wrote on last edited by
                      #11

                      @ChrisW67 I just tested your code and it works!

                      So should I just put all of the connecting actions in this file or is there anyway to put them in separate python files? I wanted to make the code cleaner by removing dividing a single python file into multiple modules.

                      1 Reply Last reply
                      0
                      • C Offline
                        C Offline
                        ChrisW67
                        wrote on last edited by
                        #12

                        If you want to separate functionality into multiple Python file then my first example is approximately the direction to go. The EmbedPage has code related to its own buttons and MainWindow does not know about this. The first example does break the encapsulation of the MenuPage in order to do the connect() plumbing with the reveal/hide buttons. You could tidy that up by having MenuPage emit a signal corresponding to a desired page, and then connect that to setCurrentPage() in the MainWindow.

                        If not, then my second example.

                        1 Reply Last reply
                        1
                        • B botqe

                          @ChrisW67 To be honest, the previous version of the application had different .ui files for each page and it worked fine. But I decided to have one .ui file (stackedwidget) and change between pages. This is why the code seems a bit confusing. So instead of having multiple ui files for each separate python file, I combined them into one using Qt Designer and Qstackedwidget. Right now, if I decided to change back to multiple ui files (one for each page), qpushbutton works well but in this code, it doesn't. If it was a problem of loading ui file, the graphics would not load. I'm able to move between pages as well, but when I move to another page, clicking on qpushbutton does not work...

                          JonBJ Online
                          JonBJ Online
                          JonB
                          wrote on last edited by
                          #13

                          @botqe said in QPushButton does not work:

                          To be honest, the previous version of the application had different .ui files for each page and it worked fine. But I decided to have one .ui file (stackedwidget) and change between pages.

                          FWIW, when I used Designer and had multiple pages to go into a QStackedWidget I designed the pages separately within their own .uis and then just put them into the (blank) stacked widget dynamically at runtime start up.

                          1 Reply Last reply
                          0
                          • B Offline
                            B Offline
                            botqe
                            wrote on last edited by
                            #14

                            Thank you all.

                            I fixed the code with your immense help and now it works.

                            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