|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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())
要解决在点击股票名字时更新 `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 小助理,如未能正确解答您的问题,请继续追问。
|
|