凊风 发表于 2024-4-14 15:23:45

Pyside6求教20240414~~~

现有如下代码:
class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

。。。。。。

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")

      。。。。。。

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


if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    app.exec()

请问为什么会报错:
Traceback (most recent call last):
line 1182, in <module>
    window_a = Welcome_Window()
               ^^^^^^^^^^^^^^^^
line 285, in __init__
    self.setCentralWidget(QWidget)
    ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Welcome_Window' object has no attribute 'setCentralWidget'

FishC 发表于 2024-4-14 15:23:58

你好!这个错误是因为在Welcome_Window类的构造函数中,你尝试调用了一个不存在的方法setCentralWidget。setCentralWidget是QMainWindow类的一个方法,而不是QWidget类的方法。

解决这个问题的方法是将Welcome_Window类继承自QMainWindow而不是QWidget,然后再调用setCentralWidget方法来设置中心窗口部件。修改后的代码如下:

class Welcome_Window(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")

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

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


if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    window_a.show()
    app.exec()

注意,还需要将`QApplication`的参数传递给它(`app = QApplication([])`)。另外,需要通过调用`window_a.show()`方法来显示窗口。运行修改后的代码,应该就不会报错了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 15:26:19

FishC 发表于 2024-4-14 15:23
你好!这个错误是因为在Welcome_Window类的构造函数中,你尝试调用了一个不存在的方法setCentralWidget。se ...

关键我是想让Welcome_Window从BaseWindow继承ESC、退出按钮等,

请问需要怎么解决?

FishC 发表于 2024-4-14 15:26:45

凊风 发表于 2024-04-14 15:26
关键我是想让Welcome_Window从BaseWindow继承ESC、退 ...

抱歉,给你带来了困惑。如果你希望Welcome_Window从BaseWindow继承ESC和退出按钮等功能,你可以对BaseWindow进行一些修改。让我们来看看如何修改代码:

from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PySide6.QtCore import Qt

class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

    def confirm_exit(self):
      # 自定义的退出确认逻辑
      reply = QMessageBox.question(self, "退出", "确定要退出吗?", QMessageBox.Yes | QMessageBox.No)
      if reply == QMessageBox.Yes:
            self.close()

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()

      self.setWindowTitle("欢迎使用")
      
      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

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

      self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    window_a.show()
    app.exec()

在这个修改后的代码中,Welcome_Window类继承自BaseWindow类。在BaseWindow类中,我们添加了confirm_exit方法来处理退出按钮的点击事件。除此之外,其他的代码保持不变。

这样,Welcome_Window就能够继承BaseWindow类的ESC事件和退出按钮等功能了。希望这次能够解决你的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 15:29:02

FishC 发表于 2024-4-14 15:26
抱歉,给你带来了困惑。如果你希望Welcome_Window从BaseWindow继承ESC和退出按钮等功能,你可以对BaseW ...

class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

# 设置ESC事件和# 设置退出按钮我已经放在了BaseWindow中了啊,

Welcome_Window(BaseWindow)还要再放一次?

FishC 发表于 2024-4-14 15:29:17

凊风 发表于 2024-04-14 15:29
class BaseWindow(QWidget):
    def __init__(self) ...

抱歉我的理解有误。你是对的,将ESC事件和退出按钮放在BaseWindow中就可以了,不需要在Welcome_Window再次设置。

下面是修改后的代码:

from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PySide6.QtCore import Qt

class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)
      
      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)
   
    def confirm_exit(self):
      # 自定义的退出确认逻辑
      reply = QMessageBox.question(self, "退出", "确定要退出吗?", QMessageBox.Yes | QMessageBox.No)
      if reply == QMessageBox.Yes:
            self.close()

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")
      
      layout = QVBoxLayout()
      layout.addWidget(self.exit_button)
      self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication()
    window_a = Welcome_Window()
    window_a.show()
    app.exec()

这样,在Welcome_Window中继承BaseWindow后,就会直接拥有BaseWindow中设置的ESC事件和退出按钮功能。非常抱歉给你带来的困惑,希望这次解释清楚了!如果还有其他问题,请继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 15:31:23

FishC 发表于 2024-4-14 15:29
抱歉我的理解有误。你是对的,将ESC事件和退出按钮放在BaseWindow中就可以了,不需要在Welcome_Window ...

现在的问题是:
class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

。。。。。。

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")

      。。。。。。

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


if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    app.exec()

请问为什么会报错:
Traceback (most recent call last):
line 1182, in <module>
    window_a = Welcome_Window()
               ^^^^^^^^^^^^^^^^
line 285, in __init__
    self.setCentralWidget(QWidget)
    ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Welcome_Window' object has no attribute 'setCentralWidget'

FishC 发表于 2024-4-14 15:31:39

凊风 发表于 2024-04-14 15:31
现在的问题是:
class BaseWindow(QWidget):
    de ...

非常抱歉,我之前的回答有误。setCentralWidget是QMainWindow的一个方法,不能直接在QWidget中使用。如果你想在Welcome_Window中设置一个中心部件,可以将Welcome_Window改为继承自QMainWindow而不是QWidget。修改后的代码如下:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PySide6.QtCore import Qt

class BaseWindow(QWidget):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)
      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

    def confirm_exit(self):
      # 自定义的退出确认逻辑
      reply = QMessageBox.question(
            self, "退出", "确定要退出吗?", QMessageBox.Yes | QMessageBox.No
      )
      if reply == QMessageBox.Yes:
            self.close()

class Welcome_Window(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")
      layout = QVBoxLayout()
      layout.addWidget(self.exit_button)
      widget = QWidget()
      widget.setLayout(layout)
      self.setCentralWidget(widget)

if __name__ == "__main__":
    app = QApplication()
    window_a = Welcome_Window()
    window_a.show()
    app.exec()

这样,Welcome_Window就继承了QMainWindow,可以使用setCentralWidget方法来设置中心部件。同时,我也修正了BaseWindow中退出按钮的点击事件的定义。希望这次能解决你的问题,如有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 15:36:42

FishC 发表于 2024-4-14 15:31
非常抱歉,我之前的回答有误。setCentralWidget是QMainWindow的一个方法,不能直接在QWidget中使用。如 ...

可能我没表达清楚:

现在的问题是:
class BaseWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

。。。。。。

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")

      。。。。。。

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


if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    app.exec()

我把class BaseWindow(QWidget)改成class BaseWindow(QMainWindow),
然后报错:

Traceback (most recent call last):
line 1182, in <module>
    window_a = Welcome_Window()
               ^^^^^^^^^^^^^^^^
line 285, in __init__
    self.setCentralWidget(QWidget)
TypeError: 'PySide6.QtWidgets.QMainWindow.setCentralWidget' called with wrong argument types:
PySide6.QtWidgets.QMainWindow.setCentralWidget(ObjectType)
Supported signatures:
PySide6.QtWidgets.QMainWindow.setCentralWidget(PySide6.QtWidgets.QWidget)

FishC 发表于 2024-4-14 15:37:00

凊风 发表于 2024-04-14 15:36
可能我没表达清楚:

现在的问题是:
class BaseWi ...

非常抱歉之前的回答有误。你在Welcome_Window类的构造函数中,调用`self.setCentralWidget(QWidget)`时出现了错误。`setCentralWidget`方法需要接收一个QWidget对象作为参数,而不是QWidget类本身。

你可以修改代码为`self.setCentralWidget(widget)`,将widget作为参数传递给setCentralWidget方法。这样就可以正确设置欢迎窗口的中心部件了。

修改后的代码如下:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PySide6.QtCore import Qt

class BaseWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)
      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

    def confirm_exit(self):
      # 自定义的退出确认逻辑
      reply = QMessageBox.question(
            self, "退出", "确定要退出吗?", QMessageBox.Yes | QMessageBox.No
      )
      if reply == QMessageBox.Yes:
            self.close()

class Welcome_Window(BaseWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")
      layout = QVBoxLayout()
      layout.addWidget(self.exit_button)
      widget = QWidget()
      widget.setLayout(layout)
      self.setCentralWidget(widget)

if __name__ == "__main__":
    app = QApplication([])
    window_a = Welcome_Window()
    window_a.show()
    app.exec()

希望这次能够解决你的问题。如果还有其他疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 17:08:07

FishC 发表于 2024-4-14 15:37
非常抱歉之前的回答有误。你在Welcome_Window类的构造函数中,调用`self.setCentralWidget(QWidget)`时 ...

请问这是什么错误?
Traceback (most recent call last):
line 640, in retranslateUi
    self.print_with_color1(notice, 'red')
   line 135, in print_with_color1
    format1.setForeground(color1)
TypeError: 'PySide6.QtGui.QTextFormat.setForeground' called with wrong argument types:
PySide6.QtGui.QTextFormat.setForeground(str)
Supported signatures:
PySide6.QtGui.QTextFormat.setForeground(Union)

进程已结束,退出代码为 0

FishC 发表于 2024-4-14 17:08:26

凊风 发表于 2024-04-14 17:08
请问这是什么错误?
Traceback (most recent call la ...

这个错误是因为`setForeground()`方法需要接受一个`QBrush`对象作为参数,而不是直接传入颜色字符串。你可以通过创建一个`QBrush`对象,并设置颜色,然后将其传递给`setForeground()`方法。修改代码如下:

from PySide6.QtGui import QBrush, QColor

# ...

class BaseWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      # ...

    def print_with_color1(self, message, color):
      format1 = self.text_edit.currentCharFormat()
      brush = QBrush(QColor(color))
      format1.setForeground(brush)
      cursor = self.text_edit.textCursor()
      cursor.setCharFormat(format1)
      cursor.insertText(message)

# ...

在`print_with_color1()`方法中,我们创建了一个`QBrush`对象并将颜色作为参数传递给它。然后,我们将该`QBrush`对象设置为`format1`的前景色。

希望这次能够解决你的问题。如果还有其他疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 17:12:39

FishC 发表于 2024-4-14 17:08
这个错误是因为`setForeground()`方法需要接受一个`QBrush`对象作为参数,而不是直接传入颜色字符串。 ...

报错:
Traceback (most recent call last):

   line 648, in retranslateUi
    self.print_with_color0(notice, 'red')
line 130, in print_with_color0
    format1 = self.text_edit.currentCharFormat()
            ^^^^^^^^^^^^^^
AttributeError: 'Region_Select_Window' object has no attribute 'text_edit'

FishC 发表于 2024-4-14 17:12:53

凊风 发表于 2024-04-14 17:12
报错:
Traceback (most recent call last):

   l ...

这个错误是因为你的`Region_Select_Window`类没有名为`text_edit`的属性。请确保你在`Region_Select_Window`类中添加了一个名为`text_edit`的`QTextEdit`控件或者属性。

例如,你可以修改`Region_Select_Window`类的代码如下:

class Region_Select_Window(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("选择地区")

      self.text_edit = QTextEdit(self)# 添加一个名为text_edit的QTextEdit控件
      
      layout = QVBoxLayout()
      layout.addWidget(self.text_edit)
      widget = QWidget()
      widget.setLayout(layout)
      self.setCentralWidget(widget)
      
    def print_with_color0(self, message, color):
      format1 = self.text_edit.currentCharFormat()
      brush = QBrush(QColor(color))
      format1.setForeground(brush)
      cursor = self.text_edit.textCursor()
      cursor.setCharFormat(format1)
      cursor.insertText(message)

在这个修改的代码中,我们在`Region_Select_Window`类的构造函数中添加了一个名为`text_edit`的`QTextEdit`控件,并在`print_with_color0()`方法中使用它进行相关操作。

希望能解决你的问题。如果还有其他疑问,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 18:00:23

FishC 发表于 2024-4-14 17:12
这个错误是因为你的`Region_Select_Window`类没有名为`text_edit`的属性。请确保你在`Region_Select_Wi ...

self.comboBox = QComboBox(self)
      self.comboBox.setObjectName(u"comboBox")
      self.comboBox.setGeometry(QRect(50, 155, 265, 35))
      self.comboBox.setMaximumSize(QSize(16777215, 16777215))
      self.comboBox.addItems(comboBox_data)      
      self.comboBox.setCurrentIndex(0)

请问self.comboBox中显示的字体、颜色和大小要怎么设置?

FishC 发表于 2024-4-14 18:01:15

凊风 发表于 2024-04-14 18:00
self.comboBox = QComboBox(self)
      self.comb ...

要设置`self.comboBox`中显示的字体、颜色和大小,你可以使用字体样式表(QSS)来实现。在`self.comboBox`对象上调用`setStyleSheet()`方法,并将相应的字体、颜色和大小信息作为参数传递给它。

以下是一个示例代码,展示了如何设置字体为Arial、颜色为红色、大小为12px:
self.comboBox.setStyleSheet("font-family: Arial; color: red; font-size: 12px;")

你可以根据需要修改字体、颜色和大小的值,选择合适的样式。只需将上述代码放在你的代码中`self.comboBox`的初始化之后即可。

请注意,这只是一种设置字体样式的方法。如果你想更精确地控制字体和颜色,还可以使用`QFont`和`QPalette`类进行设置。但对于简单的设置,使用样式表是一种快捷简单的方式。

希望这能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 18:29:48

FishC 发表于 2024-4-14 18:01
要设置`self.comboBox`中显示的字体、颜色和大小,你可以使用字体样式表(QSS)来实现。在`self.comboB ...

请问如何判断一个comboBox是否被点击了?

FishC 发表于 2024-4-14 18:30:01

凊风 发表于 2024-04-14 18:29
请问如何判断一个comboBox是否被点击了?

要判断一个comboBox是否被点击了,可以通过连接comboBox的`currentIndexChanged`信号来实现。当comboBox被点击并选中了一个新的项时,`currentIndexChanged`信号会被触发。可以将一个槽函数与该信号连接起来,在槽函数中执行相应的操作来判断comboBox是否被点击了。

以下是一个示例代码,展示了如何使用`currentIndexChanged`信号来检测comboBox的点击事件:

from PySide6.QtWidgets import QApplication, QComboBox, QWidget

def on_combobox_clicked(index):
    print("ComboBox clicked!")
    # 执行其他操作...

if __name__ == "__main__":
    app = QApplication()
   
    window = QWidget()
    comboBox = QComboBox(window)
    comboBox.addItem("Item 1")
    comboBox.addItem("Item 2")
    comboBox.currentIndexChanged.connect(on_combobox_clicked)
   
    window.show()
    app.exec()

在上述代码中,我们定义了一个名为`on_combobox_clicked`的槽函数,当comboBox被点击并选中了一个新的项时,该槽函数会被调用。这里只是简单地打印了一条消息,你可以根据需要在槽函数中执行其他操作。

请注意,为了能够正常触发信号,需要将comboBox放在一个QWidget窗口中,并确保窗口显示出来(如上述代码中的`window.show()`)。这样才能与应用程序的事件循环进行交互。

希望这能帮助你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 19:00:22

FishC 发表于 2024-4-14 18:30
要判断一个comboBox是否被点击了,可以通过连接comboBox的`currentIndexChanged`信号来实现。当comboBo ...

请问如何从用户所指定的文件夹中判断有没有“行政区划.xlsx”:

如果有,如何读取到“行政区划.xlsx”的更新时间?

FishC 发表于 2024-4-14 19:01:32

凊风 发表于 2024-04-14 19:00
请问如何从用户所指定的文件夹中判断有没有“行政区划 ...

要从用户指定的文件夹中判断是否存在名为“行政区划.xlsx”的文件,并获取其更新时间,可以使用Python的os模块和datetime模块来实现。以下是一个示例代码:import os
from datetime import datetime

folder_path = input("请输入文件夹路径:")# 用户输入文件夹路径

file_path = os.path.join(folder_path, "行政区划.xlsx")# 构造文件路径

if os.path.exists(file_path):# 判断文件是否存在
    # 获取文件的更新时间
    update_time = os.path.getmtime(file_path)
    update_time = datetime.fromtimestamp(update_time)
    print(f"文件存在,更新时间为:{update_time}")
else:
    print("文件不存在")

在上述代码中,我们首先通过input函数获取用户输入的文件夹路径,并使用os模块的os.path.join函数构建完整的文件路径。然后,使用os.path.exists函数判断指定的文件是否存在。

如果文件存在,我们使用os.path.getmtime函数获取文件的更新时间,该函数返回的是时间戳(自1970年1月1日以来经过的秒数)。然后,我们将时间戳转换为datetime对象,使用datetime.fromtimestamp方法进行转换。最后,我们打印出更新时间。

如果文件不存在,则输出相应的提示信息。

希望这能解决你的问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Pyside6求教20240414~~~