hejialiangya 发表于 2024-10-11 08:54:00

【python】我这段代码运行不报错,但是Sub页面不显示,请大神帮我看看问题出在哪里

from SubApplication import Ui_Form as AppUi
from SubSetting import Ui_Form as SetUi

class SubApplication(AppUi, QWidget):

    def __init__(self, parent=AppUi):
      super().__init__(parent=parent)
      self.setupUi(self)
      self.pBtnOpen.clicked.connect(self.open_img)
      self.pBtnResule.clicked.connect(self.show_result)

class SubSetting(SetUi, QWidget):

    def __init__(self, parent=SetUi):
      super().__init__(parent=parent)
      self.setupUi(self)
      self.pBtn_Font.clicked.connect(self.choose_font)




class Window(MSFluentWindow):

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

      # create sub interface
      self.homeInterface = Widget('Home Interface', self)
      self.appInterface = SubApplication(self)
      self.settingInterface = SubSetting(self)
      #self.readInterface = Widget('Read Mode', self)
      #self.bookshelfInterface = Widget('书架UI', self)

      self.libraryInterface = Widget('library ', self)

      self.initNavigation()
      self.initWindow()

    def initNavigation(self):
      # HOME_FILL表示点击后变成另一个图标
      self.addSubInterface(self.homeInterface, FIF.HOME, '主页', FIF.HOME_FILL)
      self.addSubInterface(self.appInterface, FIF.APPLICATION, '应用')
      self.addSubInterface(self.settingInterface, FIF.BASKETBALL, '设置')

      #self.addSubInterface(self.readInterface, FIF.QUICK_NOTE, '阅读')
      #self.addSubInterface(self.bookshelfInterface, FIF.BOOK_SHELF, '书架')


      self.addSubInterface(self.libraryInterface, FIF.DEVELOPER_TOOLS, 'library', position=NavigationItemPosition.BOTTOM)
      self.navigationInterface.addItem(
            routeKey='Help',
            icon=FIF.HELP,
            text='帮助',
            onClick=self.showMessageBox,
            selectable=False,
            position=NavigationItemPosition.BOTTOM,
      )

      self.navigationInterface.setCurrentItem(self.homeInterface.objectName())

    def initWindow(self):
      self.resize(1200, 800)
      self.setWindowIcon(QIcon(':/qfluentwidgets/images/logo.png'))
      self.setWindowTitle('OCR-Title--PyQt-Fluent-Widgets')
      #获取用户屏幕尺寸
      desktop = QApplication.screens().availableGeometry()
      w, h = desktop.width(), desktop.height()
      self.move(w//2 - self.width()//2, h//2 - self.height()//2)

    def showMessageBox(self):
      w = MessageBox(
            'Messagetitle',
            'MessageContent',
            self
      )
      w.yesButton.setText('确定')
      w.cancelButton.setText('退出')


if __name__ == '__main__':
    # setTheme(Theme.DARK)
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    app.exec()


运行后SubApplication和SubSetting谁在前面实例化就显示谁。另外一个就不显示(左侧导航栏连图标都没有),如下图,我把SubApplication(self)注释掉,SubSetting就可以正常显示,说明SubSetting页面本身是不存在问题的
https://tutu.to/image/wei-xin-tu-pian-20241011081158.9ITi4
https://tutu.to/image/wei-xin-tu-pian-20241011081333.9IGoP

FishC 发表于 2024-10-11 08:54:10

看起来你的代码结构是创建了一个多界面的应用,问题出现在 `SubApplication` 或者你的窗口初始化配置上。我们可以检查以下几个方面来排查问题:

1. **是否正确调用 `setupUi`**: 确保 `setupUi` 方法被正确调用并且在 UI 文件中定义了所有需要的控件。检查 `SubApplication` 的初始化过程中是否有遗漏控件或者初始化顺序问题。

2. **父类问题**: 在 `SubApplication` 和 `SubSetting` 的构造函数中,你传递的 `parent=AppUi` 和 `parent=SetUi` 可能不符合你的程序逻辑。对于这些自定义窗口类,通常你需要传递实际的父窗口或控件对象。例如,在 `SubApplication` 中作为 `QWidget` 的子类,你可能应该传递一个 `QWidget` 实例。

3. **窗口显示设置**: 确保你的窗口在初始化时设置为可见状态。检查是否有调用 `show()` 方法来显示窗口,或者是在某个方法中误隐藏了窗口。

4. **布局管理**: 确保界面的布局管理器正确设置,以便子控件能正常显示。

5. **事件连接**: 确保事件连接如 `self.pBtnOpen.clicked.connect(self.open_img)` 的方法如预期运行,并且这些方法没有引发未捕获的错误。

6. **类继承顺序**: 因为 `SubApplication` 和 `SubSetting` 都是多继承,确认继承顺序没有影响到界面组件的初始化。

根据以上步骤进行检查和调试,通常能发现问题的所在。如果以上检查还不能解决问题,建议简化你的代码,逐步排查错误的根源,也可以通过打印调试信息来辅助定位问题。

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

hejialiangya 发表于 2024-10-11 08:56:00

import的导包我省略掉了为了清晰 就剩这2个subinterface


import sys
from PySide6.QtCore import Qt, QUrl
from PySide6.QtGui import QIcon, QDesktopServices, QPixmap
from PySide6.QtWidgets import QApplication, QFrame, QHBoxLayout, QWidget, QFileDialog
from qfluentwidgets import (NavigationItemPosition, MessageBox, setTheme, Theme, MSFluentWindow, NavigationAvatarWidget, qrouter, SubtitleLabel, setFont)
from qfluentwidgets import FluentIcon as FIF

FishC 发表于 2024-10-11 09:00:09

hejialiangya 发表于 2024-10-11 08:56
import的导包我省略掉了为了清晰 就剩这2个subinterfa ...

根据您描述的问题,导航栏中只能看到一个界面,可能是因为多个类在 `QWidget` 继承或界面初始化时的某些问题。以下是几个可能的原因和调试建议:

1. **确保`Ui_Form`类的正确性**:
   - 确保 `Ui_Form` 在`SubApplication`和`SubSetting`中都正确地配置了UI组件,并且这些组件在 `setupUi()` 中被正确初始化。

2. **检查构造函数的参数**:
   - 在 `SubApplication` 和 `SubSetting` 的构造函数中传入的是 `parent`,应该是一个 QWidget 的实例。确保 `parent=AppUi` 和 `parent=SetUi` 所对应的内容是合适的,通常这些参数应为 `optional`,即默认为 `None`(即代码可能需要:`def __init__(self, parent=None):`)。

3. **位置添加和重复检查**:
   - 在 `initNavigation()`中添加到导航的操作确保没有重复或位置问题。代码中定义图标及文字信息要与实际定义时相同。

4. **检查 `addSubInterface` 函数使用**:
   - 确保 `self.addSubInterface()` 被正确调用,icon、text、位置等参数都没问题。

5. **实例顺序或逻辑问题**:
   - 如果确实存在谁先实例化就显示谁的问题,可能跟界面更新逻辑或控件覆盖相关,检查是否有设置 `show()` 或 `display()` 的代码缺失;确保之后初始化的实例不会覆盖之前的。

6. **调试信息**:
   - 在 `initNavigation()` 方法中,可以额外加一些 `print()` 输出调试信息,检查导航栏实例化和显示流程是否进行了预期调用。

通过这些步骤,我相信你可以找出问题所在。如果还有问题,可能需要查看更多的代码或进一步调试来解决。

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

hejialiangya 发表于 2024-10-11 09:02:52

FishC 发表于 2024-10-11 08:54
看起来你的代码结构是创建了一个多界面的应用,问题出现在 `SubApplication` 或者你的窗口初始化配置上。我 ...

我觉得问题出在def initNavigation上。我把谁放前面,谁放第一个addSubInterface,谁就生成,2个Sub类都没问题,

    def initNavigation(self):
      # HOME_FILL表示点击后变成另一个图标
      self.addSubInterface(self.homeInterface, FIF.HOME, '主页', FIF.HOME_FILL)

      self.addSubInterface(self.settingInterface, FIF.BASKETBALL, '设置')

      self.addSubInterface(self.appInterface, FIF.APPLICATION, '应用')

FishC 发表于 2024-10-11 09:02:58

hejialiangya 发表于 2024-10-11 09:02
我觉得问题出在def initNavigation上。我把谁放前面, ...

从你描述的问题来看,`addSubInterface` 方法可能有一些限制,导致后续的接口没有被正确添加。

以下是一些可能的解决方案:

1. **检查 `addSubInterface` 实现:** 确保这个方法正确地处理了多个子接口的添加。有时,方法内部可能有逻辑限制每次只能显示一个接口,比如会覆盖前一个接口的内容。

2. **检查图标配置:** 确保每个接口使用的图标是有效的。有时候,图标配置错误可能导致接口无法正确展示。

3. **检查 `setCurrentItem` 调用:** 最后,你设置 `self.navigationInterface.setCurrentItem` 为 `'HomeInterface'` 这可能会导致只显示该界面。可以尝试在调试时注释掉这一行以观察其影响。

4. **调试输出:** 暂时在 `addSubInterface` 方法中加入调试输出语句,确认每个接口是否被正确调用和处理。

如果这些步骤未能解决问题,请审阅或分享 `addSubInterface` 和 `setCurrentItem` 方法的具体实现,可能会有更具体的发现。

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

hejialiangya 发表于 2024-10-11 09:04:20

FishC 发表于 2024-10-11 08:54
看起来你的代码结构是创建了一个多界面的应用,问题出现在 `SubApplication` 或者你的窗口初始化配置上。我 ...

你这个是GTP的回复,我提问之前已经在gtp问过了,但是没有找到问题原因所在

FishC 发表于 2024-10-11 09:04:27

hejialiangya 发表于 2024-10-11 09:04
你这个是GTP的回复,我提问之前已经在gtp问过了,但是 ...

从你的描述来看,问题可能出在 `addSubInterface` 方法的实现上。根据你提到的行为表现,两个界面中哪个先实例化,哪个就能正常显示,而另一个无法在导航栏中显示,这可能意味着你的 `addSubInterface` 方法在处理这些界面时遇到了一些问题。

以下是一些可能的检查方向:

1. **确保每个界面都有唯一的 `objectName`**:在 `addSubInterface` 方法中,它可能使用了 `objectName` 作为唯一标识,把不同的界面加进去时,确保它们的 `objectName` 是不同的。你可以在 `SubApplication` 和 `SubSetting` 初始化时设定不同的 `objectName`。

2. **检查 `addSubInterface` 的具体实现**:确认这个方法是如何操作的,是否有可能通过多次调用覆盖了之前的设置,引起了导航栏显示的问题。

3. **查看 `NavigationInterface` 的逻辑**:如果有任何关于唯一性(比如 objectName 或者 routeKey)的要求,确保它们没有冲突。

4. **调试输出**:增加一些调试输出来检查每个界面的初始化和 `addSubInterface` 中导航菜单的创建过程是否正常,看看两个界面在导航中是否被正常添加。

请仔细检查这些地方,如果问题依旧没有解决,你可以提供 `addSubInterface` 的实现代码以便进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 【python】我这段代码运行不报错,但是Sub页面不显示,请大神帮我看看问题出在哪里