Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyQt5中,当在QStackedWidget上单击标签上的按钮时,如何移动到另一个标签?_Python_Pyqt5_Qstackedwidget - Fatal编程技术网

Python 在PyQt5中,当在QStackedWidget上单击标签上的按钮时,如何移动到另一个标签?

Python 在PyQt5中,当在QStackedWidget上单击标签上的按钮时,如何移动到另一个标签?,python,pyqt5,qstackedwidget,Python,Pyqt5,Qstackedwidget,在PyQt5中,在StackedWidget上单击标签上的按钮时,如何移动到另一个标签 当您单击按钮3时,我希望显示后屏幕(后标签) 我应该使用什么代码来显示后屏幕(后标签) 完整代码: import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class Before(QWidg

在PyQt5中,在StackedWidget上单击标签上的按钮时,如何移动到另一个标签

当您单击按钮3时,我希望显示后屏幕(后标签)

我应该使用什么代码来显示后屏幕(后标签)

完整代码:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Before(QWidget): ## Before label

    def __init__(self):
        super(Before, self).__init__()
        self.label = QtWidgets.QLabel(self)
        self.label.setGeometry(QtCore.QRect(240, 210, 301, 81))
        font = QtGui.QFont()
        font.setPointSize(30)
        self.label.setFont(font)
        self.label.setText("Before 화면") # 화면 == screen
        self.label.setObjectName("label")

        self.pushButton_3 = QtWidgets.QPushButton(self)
        self.pushButton_3.setGeometry(QtCore.QRect(590, 220, 141, 61))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.pushButton_3.setText("NEXT")
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_3.clicked.connect(self.click_next)


    def click_next(self):
        pass
        ## I want to move to After label



class After(QWidget): ## After label

    def __init__(self):
        super(After, self).__init__()
        self.label_2 = QtWidgets.QLabel(self)
        self.label_2.setGeometry(QtCore.QRect(240, 210, 301, 81))
        font = QtGui.QFont()
        font.setPointSize(30)
        self.label_2.setFont(font)
        self.label_2.setText("After 화면") # 화면 == screen
        self.label_2.setObjectName("label_2")

        self.pushButton_4 = QtWidgets.QPushButton(self)
        self.pushButton_4.setGeometry(QtCore.QRect(30, 220, 141, 61))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.pushButton_4.setText("BEFORE")
        self.pushButton_4.setFont(font)
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_4.clicked.connect(self.click_before)

    def click_before(self):
        pass
        ## I want to move to Before label


class Ui_StackedWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.stk_w = QStackedWidget(self)
        self.setupUi()


   def setupUi(self):
        self.setWindowTitle("Example3-02")
        self.resize(800, 600)

        widget_laytout = QBoxLayout(QBoxLayout.LeftToRight)
        self.stk_w.addWidget(Before())
        self.stk_w.addWidget(After())
        widget_laytout.addWidget(self.stk_w)
        self.setLayout(widget_laytout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Ui_StackedWidget()
    form.show()
    exit(app.exec_())
这是前屏幕。

这是后屏幕。

您可以将这些按钮从主窗口连接到切换堆叠小部件页面的功能。为此,您应该保留对这些小部件的引用,而不是在
addWidget()
中创建它们


注意:无需将
flags
参数添加到
\uuuu init\uuuu
,所有QWidget都已设置了该标志。另外,如果您不使用从右到左的语言,您可以使用create a QHBoxLayout()而不是QBoxLayout(QBoxLayout.LeftToRight):虽然结果相同,但它更具可读性,是首选的约定。

如果您计划使用两个以上的小部件,则可以使用其他答案的替代方法:

from PySide2.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout, QLabel, QStackedWidget
import sys

# Using PySide2 as an alternative to PyQt5 - Only difference would be import route.


class Base(QWidget):

    def __init__(self, label):
        super().__init__()

        self.label = QLabel(label)
        self.previous_button = QPushButton("Next")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.previous_button)

        self.setLayout(self.layout)


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.widgets = [Base(f"{i}번 화면") for i in range(3)]

        self.stack = QStackedWidget()
        for widget in self.widgets:
            widget.previous_button.released.connect(self.onSignal)
            self.stack.addWidget(widget)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.stack)

        self.setLayout(self.layout)

    def onSignal(self):
        current_idx = self.stack.currentIndex()
        idx_next = 0 if current_idx == self.stack.count() - 1 else current_idx + 1
        self.stack.setCurrentIndex(idx_next)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


在这种情况下,您可以在多个实例中循环,或者添加反向按钮以双向循环。

谢谢您的回答!它是按照我的想法实现的!!!!非常感谢。这很有帮助!我还有一个问题。如果我点击按钮,屏幕可以改变并传递字符串值吗?@LeeJiHye“屏幕改变并传递字符串值”是什么意思?是的。我应用了下面的代码并成功地传递了字符串值!self.after.button_4.clicked.connect(self.goToBefore)@LeeJiHye抱歉,我不明白你在说什么。你需要做什么?
class Ui_StackedWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.stk_w = QStackedWidget(self)
        self.setupUi()

   def setupUi(self):
        self.setWindowTitle("Example3-02")
        self.resize(800, 600)

        widget_laytout = QBoxLayout(QBoxLayout.LeftToRight)
        self.before = Before()
        self.stk_w.addWidget(self.before)
        self.after = After()
        self.stk_w.addWidget(self.after)
        widget_laytout.addWidget(self.stk_w)
        self.setLayout(widget_laytout)

        self.before.pushButton_3.clicked.connect(self.goToAfter)
        self.after.pushButton_4.clicked.connect(self.goToBefore)

    def goToAfter(self):
        self.stk_w.setCurrentWidget(self.after)

    def goToBefore(self):
        self.stk_w.setCurrentWidget(self.before)
from PySide2.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout, QLabel, QStackedWidget
import sys

# Using PySide2 as an alternative to PyQt5 - Only difference would be import route.


class Base(QWidget):

    def __init__(self, label):
        super().__init__()

        self.label = QLabel(label)
        self.previous_button = QPushButton("Next")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.previous_button)

        self.setLayout(self.layout)


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.widgets = [Base(f"{i}번 화면") for i in range(3)]

        self.stack = QStackedWidget()
        for widget in self.widgets:
            widget.previous_button.released.connect(self.onSignal)
            self.stack.addWidget(widget)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.stack)

        self.setLayout(self.layout)

    def onSignal(self):
        current_idx = self.stack.currentIndex()
        idx_next = 0 if current_idx == self.stack.count() - 1 else current_idx + 1
        self.stack.setCurrentIndex(idx_next)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())