【问题标题】:Problem with changing QStackedWidget index更改 QStackedWidget 索引的问题
【发布时间】:2021-01-02 20:31:12
【问题描述】:

让我描述一下我的问题。我正在使用 PySide2、QtDesigner 和 Python。在 QtDesigner 中,我创建了 QStakedWidget 并使用此处建议的项目结构 https://stackoverflow.com/a/53926554/14071081 提升了我的 custome pages. 我。 当点击 Add_Strategy_Page_Rule 中的 pushButton 时,我想访问 window = MainWidget() 以将 currentIndex 更改为 0。 创建 MainWidget 的新对象不起作用,所以我认为唯一的方法是以某种方式聊天/导入 window来自 mainWindow.py。只需在 add_stratrgy_rule_page.py 中通过 import main 导入 main 原因:screen from console 有解决方案/技巧吗?

ma​​inWindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1000</width>
    <height>600</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>1000</width>
    <height>600</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="minimumSize">
    <size>
     <width>1000</width>
     <height>600</height>
    </size>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <widget class="QStackedWidget" name="widget_pages">
      <property name="currentIndex">
       <number>1</number>
      </property>
      <widget class="Strategy_Widget" name="strategy_page">
       <layout class="QHBoxLayout" name="horizontalLayout_6">
        <property name="spacing">
         <number>0</number>
        </property>
        <property name="leftMargin">
         <number>0</number>
        </property>
        <property name="topMargin">
         <number>0</number>
        </property>
        <property name="rightMargin">
         <number>0</number>
        </property>
        <property name="bottomMargin">
         <number>0</number>
        </property>
       </layout>
      </widget>
      <widget class="Add_Strategy_Rule_Widget" name="add_strategy_rule_page"/>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <customwidgets>
  <customwidget>
   <class>Strategy_Widget</class>
   <extends>QWidget</extends>
   <header>pages/strategy_page</header>
   <container>1</container>
  </customwidget>
  <customwidget>
   <class>Add_Strategy_Rule_Widget</class>
   <extends>QWidget</extends>
   <header>pages/add_strategy_rule_page</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

ma​​inWindow.py

import os
from PySide2 import QtWidgets
from PySide2.QtUiTools import loadUiType

current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = loadUiType(os.path.join(current_dir, "ui/mainWindow.ui"))

class MainWidget(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("fusion")
    window = MainWidget()
    window.show()
    sys.exit(app.exec_())

strategy_page.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>1003</width>
    <height>666</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <layout class="QHBoxLayout" name="horizontalLayout">
   <item>
    <widget class="QLabel" name="label">
     <property name="text">
      <string>Strategy Page</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

strategy_page.py

import os
from PySide2 import QtGui
from PySide2.QtUiTools import loadUiType

current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = loadUiType(os.path.join(current_dir, "../ui/strategy_page.ui"))


class Strategy_Widget(Base, Form):
    buy_stackedWidget_object = None
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Strategy_Widget()
    w.show()
    sys.exit(app.exec_())

add_strategy_rule_page.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>880</width>
    <height>454</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <property name="spacing">
    <number>0</number>
   </property>
   <property name="sizeConstraint">
    <enum>QLayout::SetDefaultConstraint</enum>
   </property>
   <property name="leftMargin">
    <number>0</number>
   </property>
   <property name="topMargin">
    <number>0</number>
   </property>
   <property name="rightMargin">
    <number>0</number>
   </property>
   <property name="bottomMargin">
    <number>0</number>
   </property>
   <item>
    <widget class="QLabel" name="label">
     <property name="text">
      <string>Add strategy rule page</string>
     </property>
    </widget>
   </item>
   <item>
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

add_strategy_rule_page.py

import os
from PySide2 import QtGui
from PySide2.QtUiTools import loadUiType

current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = loadUiType(os.path.join(current_dir, "../ui/add_strategy_rule_page.ui"))


class Add_Strategy_Rule_Widget(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect()

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Add_Strategy_Rule_Widget()
    w.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 嘿@eyllanesc 我删除了多余的代码并更改了项目以满足最小可重现示例的要求。我在github.com/kornelHub/65428201 上传了干净的版本你能看看这个吗?
  • 不,MRE 必须在您的帖子中,而不是在外部服务中
  • 嘿@eyllanesc。恕我直言,MRE 已包含在已编辑的帖子中,您现在可以看一下吗?
  • 还用新版本更新了 GitHub 存储库,以便更轻松地访问 github.com/kornelHub/65428201

标签: python pyside2 qstackedwidget


【解决方案1】:

我设法解决了这个问题。我已将 setCurrentIndex () 移至 main.py 并通过 QStackedWIdget 中的name declared custom Widget 访问它。

class MainWidget(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        self.add_strategy_rule_page.pushButton.clicked.connect(lambda: self.changeIndex())

    def changeIndex(self):
        self.widget_pages.setCurrentIndex(0)

你可以从这里下载整个解决方案:https://github.com/kornelHub/65428201 问题现在似乎很容易,但以前我没有看到。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2018-11-23
    • 2020-08-16
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多