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. Pyqt5 How to Close and Open again Textbrowser when there is new string for append?
Qt 6.11 is out! See what's new in the release blog

Pyqt5 How to Close and Open again Textbrowser when there is new string for append?

Scheduled Pinned Locked Moved Unsolved Qt for Python
7 Posts 2 Posters 2.9k 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.
  • J Offline
    J Offline
    Junhi
    wrote on last edited by
    #1

    I'm finding a way of closing previous TextBrowser window and opening new TextBrowser window when it comes new string to display
    Below is part of my code
    Here is my expectation
    if len(result_display) != 0 then pop-up dialog (Ui_Dialog) window called by display_message method in main.py
    Keep the opened dialog (Ui_Dialog) window , until new pop-up dialog (Ui_Dialog) window called by display_message
    Finally, Previous dialog (Ui_Dialog) window have been closed and kept new dialog (Ui_Dialog) window
    But when I run the script, New dialog (Ui_Dialog) window have been pop-up, not closed previous dialog (Ui_Dialog) window.

    main.py

    import os
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox
    from PyQt5.QtCore import pyqtSlot, pyqtSignal
    import threading
    from threading import Thread
    from warning_window import Ui_Dialog
    
    class SleepingCellInfo(QWidget):
    
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(700, 450)
            self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.tb = QtWidgets.QTextBrowser(Dialog)
            font = QtGui.QFont()
            font.setFamily("HY궁서")
            font.setPointSize(9)
            self.tb.setFont(font)
            self.tb.setMouseTracking(True)
            self.tb.setTabletTracking(True)
            self.tb.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.tb.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse)
            self.tb.setOpenExternalLinks(False)
            self.tb.setOpenLinks(False)
            self.tb.setObjectName("textBrowser")
            self.horizontalLayout.addWidget(self.tb)
    
            self.retranslateUi(Dialog)
            self.tb.anchorClicked['QUrl'].connect(self.draw_chart)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def display_message(self):
            global result_display
            Dialog = QtWidgets.QDialog()
            ui = Ui_Dialog(result_display)
            ui.setupUi(Dialog)
            Dialog.exec_()
    
        def retranslateUi(self, Dialog):
            _translate = QtCore.QCoreApplication.translate
            Dialog.setWindowTitle(_translate("Dialog", "SLEEPING CELL INFO V5"))
    
    
        def discover_sleeping_cell(self):
    
            global order
            global result_display
    
                sql_command_display = "SELECT * From SLEEPING_CELL_DEMO where DATE==" + list_date + " and ROP=='" + list_rop + "'" + " and STATE != 'NORM'"
                print(sql_command_display)
                cursor.execute(sql_command_display)
                result_display = cursor.fetchall()
                if (len(result_display) != 0):
    
                    p1 = Thread(target=self.display_message)
                    p1.start()
    
                    for var in result_display:
                        bla bla bla
    
    
                elif(len(result_display) == 0):
                   bla bla bla 
            cursor.close()
            conn.close()
            fp_sleeping_cell.close()
        #    os.remove(target_filename)
    
        #else:
        #    pass
            order = order + 1
            if order == 32:
                sys.exit(app.exec_())
            self.wait_10min()
    
        def wait_10min(self):
            global order
            t = threading.Timer(1.0,self.discover_sleeping_cell)
            t.start()
    
    if __name__ == '__main__':
        global order
        app = QtWidgets.QApplication(sys.argv)
        Dialog = QtWidgets.QDialog()
        ex = SleepingCellInfo()
        ex.setupUi(Dialog)
        Dialog.show()
        file_list = ['suspect_sleeping_20200704.1200.txt', 'suspect_sleeping_20200704.1215.txt',
                     'suspect_sleeping_20200704.1230.txt', 'suspect_sleeping_20200704.1245.txt',
                     'suspect_sleeping_20200704.1300.txt', 'suspect_sleeping_20200704.1315.txt',
                     'suspect_sleeping_20200704.1330.txt', 'suspect_sleeping_20200704.1345.txt',
                     'suspect_sleeping_20200705.1200.txt', 'suspect_sleeping_20200705.1215.txt',
                     'suspect_sleeping_20200705.1230.txt', 'suspect_sleeping_20200705.1245.txt',
                     'suspect_sleeping_20200705.1300.txt', 'suspect_sleeping_20200705.1315.txt',
                     'suspect_sleeping_20200705.1330.txt', 'suspect_sleeping_20200705.1345.txt',
                     'suspect_sleeping_20200706.1200.txt', 'suspect_sleeping_20200706.1215.txt',
                     'suspect_sleeping_20200706.1230.txt', 'suspect_sleeping_20200706.1245.txt',
                     'suspect_sleeping_20200706.1300.txt', 'suspect_sleeping_20200706.1315.txt',
                     'suspect_sleeping_20200706.1330.txt', 'suspect_sleeping_20200706.1345.txt',
                     'suspect_sleeping_20200707.1200.txt', 'suspect_sleeping_20200707.1215.txt',
                     'suspect_sleeping_20200707.1230.txt', 'suspect_sleeping_20200707.1245.txt',
                     'suspect_sleeping_20200707.1300.txt', 'suspect_sleeping_20200707.1315.txt',
                     'suspect_sleeping_20200707.1330.txt', 'suspect_sleeping_20200707.1345.txt']
        order = 0
        ex.wait_10min()
        sys.exit(app.exec_())
    

    warning_window.py

    from PyQt5 import QtCore, QtGui, QtWidgets
    import sys
    
    class Ui_Dialog(object):
    
        def __init__(self,msg):
            global list_of_sleeping_cell
            list_of_sleeping_cell = msg
            print(list_of_sleeping_cell)
    
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(768, 794)
            self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.warn_sleeping = QtWidgets.QTextBrowser(Dialog)
            self.warn_sleeping.setFrameShape(QtWidgets.QFrame.StyledPanel)
            self.warn_sleeping.setFrameShadow(QtWidgets.QFrame.Plain)
            self.warn_sleeping.setLineWidth(3)
            self.warn_sleeping.setMidLineWidth(1)
            self.warn_sleeping.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
            self.warn_sleeping.setObjectName("warn_sleeping")
            self.horizontalLayout.addWidget(self.warn_sleeping)
    
            self.retranslateUi(Dialog)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
            ################################################
            lenth_sleeping_cell_list = len(list_of_sleeping_cell)
    
            self.warn_sleeping.setText("bla~~~~~~~~~")
            for info in list_of_sleeping_cell:
                date = info[0]
                time = info[1]
                eNB = info[2]
                cell = info[3]
                status = info[10]
                self.warn_sleeping.append("\n")
                string_date = "DATE :" + str(date)
                self.warn_sleeping.append(string_date)
                self.warn_sleeping.append("TIME :" + str(time))
                self.warn_sleeping.append("eNB :" + str(eNB))
                self.warn_sleeping.append("DATE :" + str(cell))
                self.warn_sleeping.append("STATUS :" + str(status))
                self.warn_sleeping.append("\n")
    
            print (list_of_sleeping_cell)
    
            ################################################
    
        def retranslateUi(self, Dialog):
            _translate = QtCore.QCoreApplication.translate
            Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
            self.warn_sleeping.setText(_translate("Dialog", "TextLabel"))
    
    
    if __name__ == "__main__":
    #    import sys
        app = QtWidgets.QApplication(sys.argv)
        Dialog = QtWidgets.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()
        sys.exit(app.exec_())
    
    jsulmJ 1 Reply Last reply
    0
    • J Junhi

      I'm finding a way of closing previous TextBrowser window and opening new TextBrowser window when it comes new string to display
      Below is part of my code
      Here is my expectation
      if len(result_display) != 0 then pop-up dialog (Ui_Dialog) window called by display_message method in main.py
      Keep the opened dialog (Ui_Dialog) window , until new pop-up dialog (Ui_Dialog) window called by display_message
      Finally, Previous dialog (Ui_Dialog) window have been closed and kept new dialog (Ui_Dialog) window
      But when I run the script, New dialog (Ui_Dialog) window have been pop-up, not closed previous dialog (Ui_Dialog) window.

      main.py

      import os
      import sys
      from PyQt5 import QtCore, QtGui, QtWidgets
      from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox
      from PyQt5.QtCore import pyqtSlot, pyqtSignal
      import threading
      from threading import Thread
      from warning_window import Ui_Dialog
      
      class SleepingCellInfo(QWidget):
      
          def setupUi(self, Dialog):
              Dialog.setObjectName("Dialog")
              Dialog.resize(700, 450)
              self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
              self.horizontalLayout.setObjectName("horizontalLayout")
              self.tb = QtWidgets.QTextBrowser(Dialog)
              font = QtGui.QFont()
              font.setFamily("HY궁서")
              font.setPointSize(9)
              self.tb.setFont(font)
              self.tb.setMouseTracking(True)
              self.tb.setTabletTracking(True)
              self.tb.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
              self.tb.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse)
              self.tb.setOpenExternalLinks(False)
              self.tb.setOpenLinks(False)
              self.tb.setObjectName("textBrowser")
              self.horizontalLayout.addWidget(self.tb)
      
              self.retranslateUi(Dialog)
              self.tb.anchorClicked['QUrl'].connect(self.draw_chart)
              QtCore.QMetaObject.connectSlotsByName(Dialog)
      
          def display_message(self):
              global result_display
              Dialog = QtWidgets.QDialog()
              ui = Ui_Dialog(result_display)
              ui.setupUi(Dialog)
              Dialog.exec_()
      
          def retranslateUi(self, Dialog):
              _translate = QtCore.QCoreApplication.translate
              Dialog.setWindowTitle(_translate("Dialog", "SLEEPING CELL INFO V5"))
      
      
          def discover_sleeping_cell(self):
      
              global order
              global result_display
      
                  sql_command_display = "SELECT * From SLEEPING_CELL_DEMO where DATE==" + list_date + " and ROP=='" + list_rop + "'" + " and STATE != 'NORM'"
                  print(sql_command_display)
                  cursor.execute(sql_command_display)
                  result_display = cursor.fetchall()
                  if (len(result_display) != 0):
      
                      p1 = Thread(target=self.display_message)
                      p1.start()
      
                      for var in result_display:
                          bla bla bla
      
      
                  elif(len(result_display) == 0):
                     bla bla bla 
              cursor.close()
              conn.close()
              fp_sleeping_cell.close()
          #    os.remove(target_filename)
      
          #else:
          #    pass
              order = order + 1
              if order == 32:
                  sys.exit(app.exec_())
              self.wait_10min()
      
          def wait_10min(self):
              global order
              t = threading.Timer(1.0,self.discover_sleeping_cell)
              t.start()
      
      if __name__ == '__main__':
          global order
          app = QtWidgets.QApplication(sys.argv)
          Dialog = QtWidgets.QDialog()
          ex = SleepingCellInfo()
          ex.setupUi(Dialog)
          Dialog.show()
          file_list = ['suspect_sleeping_20200704.1200.txt', 'suspect_sleeping_20200704.1215.txt',
                       'suspect_sleeping_20200704.1230.txt', 'suspect_sleeping_20200704.1245.txt',
                       'suspect_sleeping_20200704.1300.txt', 'suspect_sleeping_20200704.1315.txt',
                       'suspect_sleeping_20200704.1330.txt', 'suspect_sleeping_20200704.1345.txt',
                       'suspect_sleeping_20200705.1200.txt', 'suspect_sleeping_20200705.1215.txt',
                       'suspect_sleeping_20200705.1230.txt', 'suspect_sleeping_20200705.1245.txt',
                       'suspect_sleeping_20200705.1300.txt', 'suspect_sleeping_20200705.1315.txt',
                       'suspect_sleeping_20200705.1330.txt', 'suspect_sleeping_20200705.1345.txt',
                       'suspect_sleeping_20200706.1200.txt', 'suspect_sleeping_20200706.1215.txt',
                       'suspect_sleeping_20200706.1230.txt', 'suspect_sleeping_20200706.1245.txt',
                       'suspect_sleeping_20200706.1300.txt', 'suspect_sleeping_20200706.1315.txt',
                       'suspect_sleeping_20200706.1330.txt', 'suspect_sleeping_20200706.1345.txt',
                       'suspect_sleeping_20200707.1200.txt', 'suspect_sleeping_20200707.1215.txt',
                       'suspect_sleeping_20200707.1230.txt', 'suspect_sleeping_20200707.1245.txt',
                       'suspect_sleeping_20200707.1300.txt', 'suspect_sleeping_20200707.1315.txt',
                       'suspect_sleeping_20200707.1330.txt', 'suspect_sleeping_20200707.1345.txt']
          order = 0
          ex.wait_10min()
          sys.exit(app.exec_())
      

      warning_window.py

      from PyQt5 import QtCore, QtGui, QtWidgets
      import sys
      
      class Ui_Dialog(object):
      
          def __init__(self,msg):
              global list_of_sleeping_cell
              list_of_sleeping_cell = msg
              print(list_of_sleeping_cell)
      
          def setupUi(self, Dialog):
              Dialog.setObjectName("Dialog")
              Dialog.resize(768, 794)
              self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
              self.horizontalLayout.setObjectName("horizontalLayout")
              self.warn_sleeping = QtWidgets.QTextBrowser(Dialog)
              self.warn_sleeping.setFrameShape(QtWidgets.QFrame.StyledPanel)
              self.warn_sleeping.setFrameShadow(QtWidgets.QFrame.Plain)
              self.warn_sleeping.setLineWidth(3)
              self.warn_sleeping.setMidLineWidth(1)
              self.warn_sleeping.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
              self.warn_sleeping.setObjectName("warn_sleeping")
              self.horizontalLayout.addWidget(self.warn_sleeping)
      
              self.retranslateUi(Dialog)
              QtCore.QMetaObject.connectSlotsByName(Dialog)
      
              ################################################
              lenth_sleeping_cell_list = len(list_of_sleeping_cell)
      
              self.warn_sleeping.setText("bla~~~~~~~~~")
              for info in list_of_sleeping_cell:
                  date = info[0]
                  time = info[1]
                  eNB = info[2]
                  cell = info[3]
                  status = info[10]
                  self.warn_sleeping.append("\n")
                  string_date = "DATE :" + str(date)
                  self.warn_sleeping.append(string_date)
                  self.warn_sleeping.append("TIME :" + str(time))
                  self.warn_sleeping.append("eNB :" + str(eNB))
                  self.warn_sleeping.append("DATE :" + str(cell))
                  self.warn_sleeping.append("STATUS :" + str(status))
                  self.warn_sleeping.append("\n")
      
              print (list_of_sleeping_cell)
      
              ################################################
      
          def retranslateUi(self, Dialog):
              _translate = QtCore.QCoreApplication.translate
              Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
              self.warn_sleeping.setText(_translate("Dialog", "TextLabel"))
      
      
      if __name__ == "__main__":
      #    import sys
          app = QtWidgets.QApplication(sys.argv)
          Dialog = QtWidgets.QDialog()
          ui = Ui_Dialog()
          ui.setupUi(Dialog)
          Dialog.show()
          sys.exit(app.exec_())
      
      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Junhi said in Pyqt5 How to Close and Open again Textbrowser when there is new string for append?:

      Dialog = QtWidgets.QDialog()

      You should make Dialog a class member. Then you can close it before starting new one.

      if self.Dialog:
          self.Dialog.close()
      self.Dialog = QtWidgets.QDialog()
      

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      J 1 Reply Last reply
      0
      • jsulmJ jsulm

        @Junhi said in Pyqt5 How to Close and Open again Textbrowser when there is new string for append?:

        Dialog = QtWidgets.QDialog()

        You should make Dialog a class member. Then you can close it before starting new one.

        if self.Dialog:
            self.Dialog.close()
        self.Dialog = QtWidgets.QDialog()
        
        J Offline
        J Offline
        Junhi
        wrote on last edited by
        #3

        @jsulm Thank you for your interest. But I cannot understand what should I do.
        As with your reply and my decision, I edit warning_window.py as below

        def setupUi(self, Dialog):

            if self.Dialog:
                self.Dialog.close() 
        

        ==> Add these 2 lines in setupUi

        def Dialog(self):
            self.Dialog = QtWidgets.QDialog()
        

        ==> make Dialog as a member of Ui_Dialog

        When I run this , error occurs below
        Exception in thread Thread-42:
        Traceback (most recent call last):
        File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
        self.run()
        File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
        self._target(*self._args, **self._kwargs)
        File "C:/Users/think/PycharmProjects/network_monitor/crte_sleepingcell_db_5.py", line 45, in display_message
        ui.setupUi(Dialog)
        File "C:\Users\think\PycharmProjects\network_monitor\warning_window.py", line 25, in setupUi
        self.Dialog.close()
        AttributeError: 'function' object has no attribute 'close'

        jsulmJ 1 Reply Last reply
        0
        • J Junhi

          @jsulm Thank you for your interest. But I cannot understand what should I do.
          As with your reply and my decision, I edit warning_window.py as below

          def setupUi(self, Dialog):

              if self.Dialog:
                  self.Dialog.close() 
          

          ==> Add these 2 lines in setupUi

          def Dialog(self):
              self.Dialog = QtWidgets.QDialog()
          

          ==> make Dialog as a member of Ui_Dialog

          When I run this , error occurs below
          Exception in thread Thread-42:
          Traceback (most recent call last):
          File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
          self.run()
          File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
          self._target(*self._args, **self._kwargs)
          File "C:/Users/think/PycharmProjects/network_monitor/crte_sleepingcell_db_5.py", line 45, in display_message
          ui.setupUi(Dialog)
          File "C:\Users\think\PycharmProjects\network_monitor\warning_window.py", line 25, in setupUi
          self.Dialog.close()
          AttributeError: 'function' object has no attribute 'close'

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Junhi You have name clash, just rename the variable from self.Dialog to, for example, self.__dialog.
          By the way upper case variable names like in

          def setupUi(self, Dialog):
          

          are bad idea as usually classes are named like this.

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          J 1 Reply Last reply
          1
          • jsulmJ jsulm

            @Junhi You have name clash, just rename the variable from self.Dialog to, for example, self.__dialog.
            By the way upper case variable names like in

            def setupUi(self, Dialog):
            

            are bad idea as usually classes are named like this.

            J Offline
            J Offline
            Junhi
            wrote on last edited by
            #5

            @jsulm Sorry for bothering, but result is same as before. (AttributeError: 'function' object has no attribute 'close')

            Following is my job history

            1. Edit setupUi in warning_window.py like :
            def setupUi(self, dialog):
            
                    if self._dialog:
                        self._dialog.close()
            
            1. Define _dialog method in the Ui_Dialog class
                def _dialog(self):
                    self._dialog = QtWidgets.QDialog()
            
            jsulmJ 1 Reply Last reply
            0
            • J Junhi

              @jsulm Sorry for bothering, but result is same as before. (AttributeError: 'function' object has no attribute 'close')

              Following is my job history

              1. Edit setupUi in warning_window.py like :
              def setupUi(self, dialog):
              
                      if self._dialog:
                          self._dialog.close()
              
              1. Define _dialog method in the Ui_Dialog class
                  def _dialog(self):
                      self._dialog = QtWidgets.QDialog()
              
              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Junhi said in Pyqt5 How to Close and Open again Textbrowser when there is new string for append?:

              Define _dialog method in the Ui_Dialog class

              def _dialog(self):
                  self._dialog = QtWidgets.QDialog()
              

              Sorry, but what is this?!
              Now you define a method called _dialog and try to assign to it.
              I was talking about this:

              def display_message(self):
                      global result_display
                      if self.__dialog:
                          self.__dialog.close()
                      self.__dialog = QtWidgets.QDialog()
                      ui = Ui_Dialog(result_display)
                      ui.setupUi(self.__dialog)
                      self.__dialog.exec_()
              

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              J 1 Reply Last reply
              1
              • jsulmJ jsulm

                @Junhi said in Pyqt5 How to Close and Open again Textbrowser when there is new string for append?:

                Define _dialog method in the Ui_Dialog class

                def _dialog(self):
                    self._dialog = QtWidgets.QDialog()
                

                Sorry, but what is this?!
                Now you define a method called _dialog and try to assign to it.
                I was talking about this:

                def display_message(self):
                        global result_display
                        if self.__dialog:
                            self.__dialog.close()
                        self.__dialog = QtWidgets.QDialog()
                        ui = Ui_Dialog(result_display)
                        ui.setupUi(self.__dialog)
                        self.__dialog.exec_()
                
                J Offline
                J Offline
                Junhi
                wrote on last edited by
                #7

                @jsulm The dialog for close is from warning_window.py
                your code is for closing dialog in the main.py(SleepingCellInfo) class.
                Your code makes errors
                Exception in thread Thread-42:
                Traceback (most recent call last):
                File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
                self.run()
                File "C:\Users\think\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
                self._target(*self._args, **self._kwargs)
                File "C:/Users/think/PycharmProjects/network_monitor/crte_sleepingcell_db_5.py", line 43, in display_message
                if self.__dialog:
                AttributeError: 'SleepingCellInfo' object has no attribute '_SleepingCellInfo__dialog'

                I want my code to act

                1. When if (len(result_display) != 0): is true,
                  pop-up dialog window called from warning_window.py (Ui_Dialog class)
                2. if (len(result_display) != 0): is true again,
                  Close previous dialog window and pop-up new one.

                Because display_message(self): method is part of main.py, self.__dialog in your code became SleepingCellInfo__dialog.

                My wish is to open or close Ui_Dialog.__dialog.

                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