zhiyiYo / PyQt-Fluent-Widgets

A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
https://qfluentwidgets.com
GNU General Public License v3.0
5.61k stars 541 forks source link

关于Combobox弹出报错 #83

Closed AuroraZiling closed 1 year ago

AuroraZiling commented 1 year ago

描述

在点击Combobox后无法展开选项,会报错

Traceback (most recent call last):
  File "C:\CodingSpace\sangonomiya\sangonomiya\venv\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 122, in mouseReleaseEvent
    self._showComboMenu()
  File "C:\CodingSpace\sangonomiya\sangonomiya\venv\Lib\site-packages\qfluentwidgets\components\widgets\combo_box.py", line 139, in _showComboMenu
    menu.exec(self.mapToGlobal(QPoint(x, y)))
  File "C:\CodingSpace\sangonomiya\sangonomiya\venv\Lib\site-packages\qfluentwidgets\components\widgets\menu.py", line 581, in exec
    self.ani.setStartValue(pos-QPoint(0, h/2))
                               ^^^^^^^^^^^^^^
TypeError: arguments did not match any overloaded call:
  QPoint(): too many arguments
  QPoint(xpos: int, ypos: int): argument 2 has unexpected type 'float'
  QPoint(a0: QPoint): argument 1 has unexpected type 'int'

环境

部分代码

self.customizeLanguageSetting = ComboBoxSettingCard(
            cfg.customizeLanguage,
            FluentIcon.LANGUAGE,
            self.tr("Language"),
            self.tr("Set the language"),
            texts=['简体中文', 'English', self.tr('Use system setting')],
            parent=self.customizeGroup
        )

出错位置 widgets -> menu

def exec(self, pos, ani=True):
    """ show menu

    Parameters
    ----------
    pos: QPoint
        pop-up position

    ani: bool
        Whether to show pop-up animation
    """
    if self.isVisible():
        return

    rect = QApplication.screenAt(QCursor.pos()).availableGeometry()
    w, h = self.width() + 5, self.height() + 5
    pos.setX(min(pos.x() - self.layout().contentsMargins().left(), rect.right() - w))
    pos.setY(min(pos.y() - 4, rect.bottom() - h))

    if ani:
        self.ani.setStartValue(pos-QPoint(0, h/2))
        self.ani.setEndValue(pos)
        self.ani.setDuration(250)
        self.ani.setEasingCurve(QEasingCurve.Type.OutQuad)
        self.ani.start()
    else:
        self.move(pos)

    self.show()

    if not self.isSubMenu:
        return

    self.menuItem.setSelected(True)

    # temporarily disable item to change style
    view = self.parentMenu.view
    index = view.row(self.menuItem)
    if index > 0:
        view.item(index-1).setFlags(Qt.ItemFlag.NoItemFlags)
    if index < view.count()-1:
        view.item(index+1).setFlags(Qt.ItemFlag.NoItemFlags)

self.ani.setStartValue(pos-QPoint(0, h/2))改为self.ani.setStartValue(pos-QPoint(0, int(h/2)))(传参都是int)即可解决,但不知道会不会影响其他东西

zhiyiYo commented 1 year ago

感谢反馈,应该不会影响其他的部件

AuroraZiling commented 1 year ago

刚刚又发现个有关QPoint传参类型错误的问题 在 common -> smooth_scroll 内:

    def __smoothMove(self):
        """ scroll smoothly when timer time out """
        totalDelta = 0

        # Calculate the scrolling distance of all unprocessed events,
        # the timer will reduce the number of steps by 1 each time it overflows.
        for i in self.stepsLeftQueue:
            totalDelta += self.__subDelta(i[0], i[1])
            i[1] -= 1

        # If the event has been processed, move it out of the queue
        while self.stepsLeftQueue and self.stepsLeftQueue[0][1] == 0:
            self.stepsLeftQueue.popleft()

        # construct wheel event
        if self.orient == Qt.Orientation.Vertical:
            pixelDelta = QPoint(round(totalDelta), 0)
            bar = self.widget.verticalScrollBar()
        else:
            pixelDelta = QPoint(0, round(totalDelta))
            bar = self.widget.horizontalScrollBar()

        e = QWheelEvent(
            self.lastPos,
            self.lastGlobalPos,
            pixelDelta,
            QPoint(totalDelta, 0),
            Qt.MouseButton.LeftButton,
            Qt.KeyboardModifier.NoModifier,
            Qt.ScrollPhase.ScrollBegin,
            False,
        )

        # send wheel event to app
        QApplication.sendEvent(bar, e)

        # stop scrolling if the queque is empty
        if not self.stepsLeftQueue:
            self.smoothMoveTimer.stop()

中的QPoint(totalDelta, 0),此处改成QPoint(int(totalDelta), 0)就修好了

zhiyiYo commented 1 year ago

这个还是用 round

AuroraZiling commented 1 year ago

是这样吗?好像不接受float image

zhiyiYo commented 1 year ago

round(totalDelta) 就好了,不需要第二个参数

AuroraZiling commented 1 year ago

好的