簡體   English   中英

PyQt5 - 自定義小部件在單獨的 windows 中打開,而不是在同一個 window 中打開

[英]PyQt5 - Custom widgets open in separate windows rather than in same window

我是 PyQt 的新手,我正在嘗試創建一個包含兩個自定義小部件的主 window,第一個是數據繪圖器,第二個是包含 QLabel 的 QGridLayout。 問題是:這兩個小部件分別打開 windows 並且沒有內容。

我發現有多個帖子有類似的問題:

但是我一直無法弄清楚為什么我的代碼不起作用。 我的目標是獲得如下左圖所示的結果,但我得到的結果如右圖所示:

在此處輸入圖像描述

我的代碼如下(可以原樣復制運行):

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QGridLayout
from PyQt5.QtGui import QFont
import sys
import pyqtgraph as pg


class CustomWidget_1(QWidget):
   def __init__(self):
      super(CustomWidget_1, self).__init__()
      self.channels = [1, 2, 3, 4, 5, 6, 7, 8]
      self.win = pg.GraphicsLayoutWidget(title='Plot', size=(800, 600))
      self.plots = list()
      self.curves = list()
      for i in range(len(self.channels)):
         p = self.win.addPlot(row=i, col=0)
         p.showAxis('left', False)
         p.setMenuEnabled('left', False)
         p.showAxis('bottom', False)
         p.setMenuEnabled('bottom', False)
         self.plots.append(p)
         curve = p.plot()
         self.curves.append(curve)
      self.win.show()
      print('CustomWidget_1 initialized.')

class CustomWidget_2(QWidget):
   def __init__(self, labelnames):
      super(CustomWidget_2, self).__init__()
      self.grid = QGridLayout()
      self.labelnames = labelnames
      self.qlabels = []
      for label in self.labelnames:
         labelBox = QLabel(label)
         labelBox.setFont(QFont('Arial', 16))
         labelBox.setStyleSheet('border: 2px solid black;')
         labelBox.setAlignment(Qt.AlignCenter)
         self.qlabels.append(labelBox)
         index = self.labelnames.index(label)
         q, r = divmod(index, 6)
         self.grid.addWidget(labelBox, q, r)
      print('CustomWidget_2 initialized.')


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

      self.labelnames = ['label 1', 'label 2', 'label 3']
      
      self.CustomWidget_1 = CustomWidget_1()
      self.CustomWidget_1.setParent(self)
      self.CustomWidget_1.show()

      self.CustomWidget_2 = CustomWidget_2(self.labelnames)
      self.CustomWidget_2.setParent(self)
      self.CustomWidget_2.show()

      self.mainLayout = QVBoxLayout()
      self.mainLayout.addWidget(self.CustomWidget_1)
      self.mainLayout.addWidget(self.CustomWidget_2)
      self.setLayout(self.mainLayout)

      self.show()


if __name__ == '__main__':
   app = QApplication(sys.argv)
   predictVisualizer = MainWindow()
   sys.exit(app.exec())

誰能告訴我我做錯了什么以及如何解決? 任何指向教程和/或模板的指針也將不勝感激! 謝謝!

你應該少寫代碼行,慢慢調試,如果你是pyqt5的新手,你應該仔細閱讀基本的Layout創建,就像你正在創建一個網站界面,鏈接: https://www.pythonguis.com/tutorials/pyqt-布局/

這是我編輯的代碼,你可以參考:

import sys
from PyQt5.QtCore import QSize,Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget,QGridLayout,QVBoxLayout,QLabel,QHBoxLayout
from PyQt5.QtGui import QPalette, QColor

class CustomWidget_1(QWidget):
    def __init__(self,color):
        super(CustomWidget_1, self).__init__()
        
        self.setAutoFillBackground(True)
        layout = QGridLayout()
        self.setLayout(layout)
        self.setFixedSize(QSize(400,300))
        
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(color))
        self.setPalette(palette)        

class CustomWidget_2(QWidget):
    def __init__(self,color):
        super(CustomWidget_2, self).__init__()
        
        self.setAutoFillBackground(True)
        layout = QHBoxLayout()
        self.setLayout(layout)
        self.setFixedSize(QSize(400,134))
        layout.setContentsMargins(70,0,0,0)
        
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(color))
        self.setPalette(palette)
        
        Label1 = QLabel()
        Label1.setText('abc')
        Label2 = QLabel()
        Label2.setText('sad')
        Label3 = QLabel()
        Label3.setText('qv')        
        layout.addWidget(Label1)
        layout.addWidget(Label2)
        layout.addWidget(Label3)
  
class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        layout = QVBoxLayout()
        
        layout.addWidget(CustomWidget_1("blue"))
        layout.addWidget(CustomWidget_2("red"))

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM