鱼C论坛

 找回密码
 立即注册
查看: 178|回复: 5

[已解决]很难用简短的画来描述清楚,问题写在正文中

[复制链接]
发表于 2025-1-12 21:12:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 rxts 于 2025-1-12 21:13 编辑


                               
登录/注册后可看大图


# 点击我的自选按钮时,会在屏幕的左上角弹出一个很小的窗口,当点击股票名字时,重绘事件就发生在那个小窗口中,而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)这个函数的绘图逻辑代码太多,我就不发了,发了也没什么用
import json
import sys
import pandas as pd
import locale
de = locale.getpreferredencoding()

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
class MainWindowA(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)


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

        self.init_ui()

    def init_ui(self):
        self.MySekect = MySekect()
        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.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)))

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


    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())
最佳答案
2025-1-12 21:12:19
要解决在点击股票名字时更新 `ChildWindowK` 中的绘图的问题,你可以使用信号和槽机制来在点击股票名称时发射信号,从而更新 `ChildWindowK` 的显示。具体来说,请确保在 `MySekect` 类中发射信号,然后在 `MainWindowA` 类中捕获该信号并触发 `ChildWindowK` 中的更新。

以下是一个可能的解决方案步骤:

1. **在 `MySekect` 中定义信号**:在 `MySekect` 类中创建一个新的信号,如 `code_selected`,用于在选择股票时发射信号。

2. **在股票列表项点击时发射信号**:在 `update_swift` 方法中发射该信号,并将股票代码作为参数传递。

3. **在 `MainWindowA` 中处理信号**:在 `MainWindowA` 类中,将 `MySekect` 的信号连接到一个新的槽函数,该函数用于更新 `ChildWindowK` 中的数据显示。

以下是代码的修改示例:
class MySekect(QDialog):   # 我的自选弹出窗口
    # 添加信号
    code_selected = Signal(str) 

    def __init__(self, parent=None):
        super(MySekect, self).__init__(parent)
        # 初始化其他代码
        self.initUI()

    def update_swift(self, code):
        self.code = code.text()
        self.swift()
        self.width_height_swift()
        # 发射信号
        self.code_selected.emit(self.code)

class MainWindowA(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 初始化其他代码

        # 连接信号到槽函数
        self.MySekect.code_selected.connect(self.update_child_window_k)

    def update_child_window_k(self, code):
        # 这里是更新 ChildWindowK 的代码
        self.ChildWindowK.js_mysekect(code)

请根据具体情况调整代码的逻辑和传递的参数,通过信号和槽机制确保子窗口在股票代码选择时能够及时更新。这样可以从 `MySekect` 中传递更新信息到 `ChildWindowK`,从而重绘界面。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-1-12 21:12:19 | 显示全部楼层    本楼为最佳答案   
要解决在点击股票名字时更新 `ChildWindowK` 中的绘图的问题,你可以使用信号和槽机制来在点击股票名称时发射信号,从而更新 `ChildWindowK` 的显示。具体来说,请确保在 `MySekect` 类中发射信号,然后在 `MainWindowA` 类中捕获该信号并触发 `ChildWindowK` 中的更新。

以下是一个可能的解决方案步骤:

1. **在 `MySekect` 中定义信号**:在 `MySekect` 类中创建一个新的信号,如 `code_selected`,用于在选择股票时发射信号。

2. **在股票列表项点击时发射信号**:在 `update_swift` 方法中发射该信号,并将股票代码作为参数传递。

3. **在 `MainWindowA` 中处理信号**:在 `MainWindowA` 类中,将 `MySekect` 的信号连接到一个新的槽函数,该函数用于更新 `ChildWindowK` 中的数据显示。

以下是代码的修改示例:
class MySekect(QDialog):   # 我的自选弹出窗口
    # 添加信号
    code_selected = Signal(str) 

    def __init__(self, parent=None):
        super(MySekect, self).__init__(parent)
        # 初始化其他代码
        self.initUI()

    def update_swift(self, code):
        self.code = code.text()
        self.swift()
        self.width_height_swift()
        # 发射信号
        self.code_selected.emit(self.code)

class MainWindowA(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 初始化其他代码

        # 连接信号到槽函数
        self.MySekect.code_selected.connect(self.update_child_window_k)

    def update_child_window_k(self, code):
        # 这里是更新 ChildWindowK 的代码
        self.ChildWindowK.js_mysekect(code)

请根据具体情况调整代码的逻辑和传递的参数,通过信号和槽机制确保子窗口在股票代码选择时能够及时更新。这样可以从 `MySekect` 中传递更新信息到 `ChildWindowK`,从而重绘界面。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-12 21:58:34 | 显示全部楼层
FishC 发表于 2025-1-12 21:12
要解决在点击股票名字时更新 `ChildWindowK` 中的绘图的问题,你可以使用信号和槽机制来在点击股票名称时发 ...

多谢回答,这个法子我也试过,但是和你做的不同,我是直接调用的实例方法,我去试试看行不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-12 21:58:42 | 显示全部楼层
rxts 发表于 2025-01-12 21:58
FishC 发表于 2025-1-12 21:12
要解决在点击股票名字 ...


好的,使用信号和槽机制在 PyQt/PySide 中是非常标准的做法,通常可以有效解决界面更新的问题。如果您在使用信号和槽机制时遇到了其他问题,也可以将实例方法直接绑定到某个事件上来强制调用。

如果这种方法不行,请检查信号和槽的连接是否正确,或者确保信号在合适的时候被发射。需要注意的是,对于界面更新,直接调用子窗口的更新方法也是一个可行的方式,但信号和槽机制通常提供了一种更优雅和模块化的解决方案。

如果您还有其他问题或者想要询问具体实现上的细节,欢迎随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-12 22:08:35 | 显示全部楼层
FishC 发表于 2025-1-12 21:12
要解决在点击股票名字时更新 `ChildWindowK` 中的绘图的问题,你可以使用信号和槽机制来在点击股票名称时发 ...

真的可以了,多谢,你真是真正的高手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-12 22:08:43 | 显示全部楼层
rxts 发表于 2025-01-12 22:08
FishC 发表于 2025-1-12 21:12
要解决在点击股票名字 ...


很高兴能够帮助到你!如果你有任何其他问题或需要进一步的帮助,请随时提问。祝你在编程的旅程中一路顺风!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 05:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表