很难用简短的画描述清楚,问题写在了最后

点击我的自选按钮时,会在屏幕的左上角弹出一个很小的窗口,当点击股票名字时,重绘事件就发生在那个小窗口中,而ChildWindowK的k线图没有被更新,
如果在MySekect中不实例化self.ChildWindowK = ChildWindowK(self)那么paintEvent函数就不会执行,如何在点击股票名字的时候可以更新,
paintEvent中的绘图?

day_k(qp=qp, x1=self.x, y1=self.y, width=self.width(), height=self.height(), self=self
, leftbutton=self.leftbutton, end=self.ends, df=self.df)这个函数的绘图逻辑代码太多,我就不发了,发了也没什么用

class MainWindowA(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.MySekect = MySekect(self)

        self.file = open('end_val.json', 'r+', encoding=de)   # 读取 指标窗口个数
        self.data = json.load(self.file)

        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("主窗口 B")
        screen = QApplication.primaryScreen().geometry()
        self.screenWidth = screen.width()
        self.screenHeight = screen.height()
        self.setGeometry(0, 0, self.screenWidth, self.screenHeight)

        self.mdi_area = QMdiArea()
        self.setCentralWidget(self.mdi_area)

        self.toggle_button1 = QPushButton('我的自选', self)    # 我的自选
        self.toggle_button1.setStyleSheet(self.qss_button(int(self.screenHeight * 0.015)))
        self.toggle_button1.clicked.connect(self.show_stock_dialog)

        self.ChildWindowK = ChildWindowK(self.mdi_area, ends=self.data["3"])
        self.mdi_area.addSubWindow(self.ChildWindowK)

        self.spin_box = QSpinBox(self)
        self.spin_box.setValue(self.data["3"])  # 指标窗口个数
        self.spin_box.valueChanged.connect(self.values_button)

        self.toggle_button2 = QPushButton('我的板块', self)
        self.toggle_button2.setStyleSheet(self.qss_button(int(self.screenHeight * 0.015)))

    def values_button(self, values):   # 窗口个数 槽函数
        self.ChildWindowK.values_button(values)
        self.file.seek(0)
        json.dump({'3': values}, self.file, ensure_ascii=False)
        self.file.truncate()

    def show_stock_dialog(self):
        visible = self.MySekect.isVisible()
        self.MySekect.setVisible(not visible)

    def qss_button(self, number):
        return f"""
        QPushButton {{
            font-size: {number}px;
            font-weight: bold; /* 设置字体为加粗 */
            color: black;
            background-color: #00B2EE;
            border: 1px solid white; /* 设置边框颜色与背景色相同 */
            border-radius: 5px; /* 可选:设置边框圆角 */
        }}
        QPushButton:pressed {{
            background-color: #98F5FF; /* 可选:设置按钮按下时的背景色 */
        }}
        """

    def resizeEvent(self, event):
        super().resizeEvent(event)
        new_size = event.size()
        self.width = new_size.width()
        self.height = new_size.height()

        button_height = int(self.height * 0.02917)
        button_width = int(self.width * 0.052)
        # upper_frame_height = int(self.height * 0.035)   # 上边框厚度

        self.toggle_button1.move(button_width * 1, 0)
        self.toggle_button1.resize(button_width, button_height)    # 我的自选
        self.spin_box.resize(button_width, button_height)    #指标

        self.toggle_button2.move(button_width * 2, 0)
        self.toggle_button2.resize(button_width, button_height)    # 我的板块

        self.ChildWindowK.update_size(self.width, self.height)   # k线窗口
        self.MySekect.update_size(self.width, self.height)  # 我的自选窗口

    def main_width_height(self):
        if self.width:
            return self.width, self.height

class ChildWindowK(QMdiSubWindow):
    xy = Signal(float, float)
    def __init__(self, parent=None, ends=None):
        super(ChildWindowK, self).__init__(parent)

        self.swift = open('swift.json', 'r', encoding=de)
        self.code = json.load(self.swift)['c']
        self.df = pd.read_csv(f'E:/tdxx/day/{self.code}.csv', encoding=de).values.tolist()

        self.setMouseTracking(False)
        self.x, self.y, self.leftbutton, self.ends = 0, 0, 1, ends
        self.xy.connect(self.update_paint)

    def values_button_js(self):
        if self.ends:
            return self.ends

    def values_button(self, end):
        self.ends = end
        self.values_button_js()
        self.update()

    def mousePressEvent(self, event: QMouseEvent):
        if event.button() == Qt.LeftButton:    # 左键
            self.leftbutton += 1
            if self.leftbutton % 2 == 0:
                self.setMouseTracking(True)
                self.left_button()
                self.update()
            else:
                self.setMouseTracking(False)
                self.left_button()
                self.update()
        elif event.button() == Qt.RightButton:    #右键
            print("鼠标右键被点击")
        else:
            super().mousePressEvent(event)

    def left_button(self):
        if self.leftbutton:
            return self.leftbutton

    def mouseMoveEvent(self, event):
        self.x = event.position().x()
        self.y = event.position().y()
        self.xy.emit(self.x, self.y)
        self.update()  # 触发重绘

    def update_paint(self, x, y):
        pass

    def paintEvent(self, event):
        print(self.code, 'pai')
        print(self.df[-1], 'pai')
        print(self.ends, 'pai')
        qp = QPainter(self)
        day_k(qp=qp, x1=self.x, y1=self.y, width=self.width(), height=self.height(), self=self
              , leftbutton=self.leftbutton, end=self.ends, df=self.df)

    def update_size(self, new_width, new_height):   # 主窗口发送来的
        y1 = int(new_height * 0.031)
        y2 = int(new_height * 0.969)
        self.setGeometry(0, y1, new_width, y2)
        self.update()

    def js_mysekect(self, *a):   # MySekect 发送来的
        self.code = a[0][0:8] + '.csv'
        self.df = pd.read_csv(f'E:/tdxx/day/{self.code}', encoding=de).values.tolist()
        self.ends = a[1]
        self.assign_code()
        self.update()

    def assign_code(self):
        if self.code and self.df:
            return self.df

class MySekect(QDialog):   # 我的自选弹出窗口
    def __init__(self, parent=None):
        super(MySekect, self).__init__(parent)
        self.ChildWindowK = ChildWindowK(self)
        num = open('end_val.json', 'r+', encoding=de)   # 读取 指标窗口个数
        self.n = json.load(num)['3']
        self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint)  # 设置无边框窗口
        self.setVisible(False)   #设置默认状态为关闭
        self.width, self.height, self.code = None, None, None
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        self.list_widget = QListWidget()
        self.list_widget.addItems(["SH600000 浦发银行    ff", "股票B", "股票C", "股票D", 'c', 'b', 'a'])  # 添加股票项
        self.list_widget.itemClicked.connect(self.update_swift)
        layout.addWidget(self.list_widget)   # 添加到布局管理器
        self.setLayout(layout)    # 将布局设置为当前部件的布局

    def update_size(self, new_width, new_height):    # 主窗口发送来的
        self.setGeometry(0, int(new_height * 0.068), int(new_width * 0.2), int(new_height * 0.947))
        self.width, self.height, = new_width, new_height
        self.width_height()
        # self.setGeometry(0, int(new_height * 0.07), int(new_width * 0.2),
        #                  int(new_height - new_height * 0.07))   #有边框的弹出窗口

    def update_swift(self, code):
        self.code = code.text()
        self.swift()
        self.width_height_swift()

    def width_height(self):
        if self.width and self.height:
            return self.width, self.height

    def swift(self):
        if self.code:
            return self.code

    def width_height_swift(self):
        width, height = self.width_height()
        code = self.swift()[0:8]
        nn = self.n
        if width and height and code:
            # self.ChildWindowK = ChildWindowK()
            self.ChildWindowK.js_mysekect(code, nn)
        else:
            print('a')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window_a = MainWindowA()
    main_window_a.show()
    sys.exit(app.exec())
最佳答案

在别的论坛解决了,在这里也记录一下: MySekect类中发射信号,然后在MainWindowA类中捕获该信号并触发ChildWindowK中的更新 不可以在MainWindowA中直接调用MySekect类的函数的方式来更新画面。

1个月前 评论
讨论数量: 6
Jason990420

Using code block for your script, or bad code will be shown as above.

```python

Your Code

```

1个月前 评论
rxts (楼主) 1个月前
Jason990420 (作者) 1个月前
rxts (楼主) 1个月前

在别的论坛解决了,在这里也记录一下: MySekect类中发射信号,然后在MainWindowA类中捕获该信号并触发ChildWindowK中的更新 不可以在MainWindowA中直接调用MySekect类的函数的方式来更新画面。

1个月前 评论
Jason990420

A short program that isolates and demonstrates the problem (Do not paste your massive program, but instead 10-20 lines that clearly show the problem)

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!