菜单元素的 ListView 信号和槽

2023-12-09

我正在尝试使用自定义元素实现某种自定义菜单。最终目标是创建某种带有文本和图标的弹出菜单。但在创作过程中我遇到了一些问题。我可以展示两个主要问题:

  1. 有一个带有标题的奇怪菜单元素Hello world在第一个位置(看起来像是读取应用程序窗口的标题):

Hello World issue

  1. 有时我会遇到类似的错误qrc:/BreezeQuickMenu.qml:45: TypeError: Property 'clicked' of object QQuickListView(0x1120830) is not a function

这是我的实际代码:

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.2

ApplicationWindow {
    title: qsTr("Hello World")
    width: Screen.width
    height: Screen.height
    visible: true
    id: win
    color: brPalette.normalBackground
BreezeQuickMenu{
    id: brMenu
    x: 490
    y: 199
    width: 128
    height: 256
    palette: brPalette
    menuFont.pointSize: 16
    BreezeQuickMenuItem{
        title: "Item 1"
        onClicked: mbox.show()
    }
    BreezeQuickMenuItem{
        title: "Item 2"
    }
    BreezeQuickMenuItem{
        title: "Item 3"
    }
  }
}

微风QuickMenu.qml

import QtQuick 2.4

Item {
    id: root
    property BreezeQuickPalette palette: BreezeQuickPalette
    property alias currentIndex: menuList.currentIndex
    property font menuFont
    property bool menuVisible: false
    implicitWidth: 128
    implicitHeight: menuList.height
    ListView{
        id: menuList
        anchors.fill: parent
        model: root.children
        clip: true
        delegate: Component {
            id: menuItem
            Rectangle {
                id: menuElement
                property bool isCurrentItem: ListView.isCurrentItem
                anchors {
                    left: parent.left
                    right: parent.right
                }
                color: palette.normalBackground
                height: menuText.font.pixelSize*1.2
                Text {
                    id: menuText
                    anchors.fill: parent
                    text: title
                    color: palette.normalText
                    font: menuFont
                }
                MouseArea {
                    anchors.fill: parent
                    hoverEnabled: true
                    onClicked: {
                        menuList.currentIndex = index
                        menuList.model[index].clicked()
                    }
                }
            }
        }
    }
}

微风QuickMenuItem.qml

import QtQuick 2.4

Item {
    id: root
    property string title: "Menu Element"
    signal clicked
}

正如您所看到的,我正在尝试使用自己的信号来实现菜单列表和菜单项。我有两个问题:

  • 我怎样才能正确地摆脱使用父元素的标题属性,因为我需要读取子元素的标题属性

  • 在菜单元素中使用信号和槽以避免上述错误的正确方法是什么?

请帮助我理解。完整的项目可以在这里拉:

git clone git://git.code.sf.net/p/breezequick/code breezequick-code


问题与signal与其声明有关。信号总是被声明为函数:带有签名。换句话说,一个signal不带参数的形式为

signal <signal_name>()

这也是您收到错误的原因“is not a function除此之外,信号/信号处理程序的使用是正确的。无论如何,仔细阅读文档不会有什么坏处。这一页详细阐述了论点。

谈到另一个问题,您做出了错误的假设:组件内声明的任何内容is的一部分children组件本身。在这里你声明了一个BreezeQuickMenu有一个孩子ListView。当你使用它并添加BreezeQuickMenuItems,您将它们添加到same设置为ListView属于.最后你有four中的元素children财产。另外,通过添加ListView to itself通过model你把事情搞砸了,以至于渲染了一个完全不相关的字符串。

有几种方法可以处理Items作为视图的模型成员,包括VisualItemModel并使用对象实例化为模型。然而,通过浏览代码,很明显您想要定义一个以声明方式添加菜单项的组件。使用children在这种情况下是不够的。您还需要default财产:

对象定义可以有一个默认属性。默认属性是如果一个对象是在另一个对象的定义中声明的,则为其赋值的属性而不将其声明为特定属性的值。

因此您可以定义default为您的财产BreezeQuickMenu并利用它来获得所需的children为您的清单。常见的方法如下(代码简化):

import QtQuick 2.4

Item {
    id: root
    property BreezeQuickPalette palette: BreezeQuickPalette
    property alias currentIndex: menuList.currentIndex

    // default declaration  (1)
    default property alias contents: addItem.children

    // Item to which the inner declared meantime will belong  (2)
    Item {
        id: addItem
    }

    property font menuFont
    property bool menuVisible: false

    implicitWidth: 128
    implicitHeight: menuList.height
    ListView{
        id: menuList
        anchors.fill: parent
        model: contents                 // usage of the default property  (3)
        clip: true
        delegate: Rectangle {
            // your current delegate code
        }
    }
}

基本思想是还利用财产alias:基本上在(1)中我们是说“所有的Items 内声明BreezeQuickMenu自动地children of addItem这是一个内部声明的Item(2)。这样一来ListView是分开的,而所有的BreezeQuickMenuItem聚集在一起,在addItem children财产。此时,使用相同的内容就足够了children财产作为model(3) 对于ListView就是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

菜单元素的 ListView 信号和槽 的相关文章

随机推荐

  • 批量插入时,某一行出错时如何继续插入其他行

    在我的代码中 我正在执行批量插入 举个例子 我有五行要插入 其中一行在插入时失败 然后休眠阻止插入所有行 就我而言 我想插入其他四个不包含错误的记录 这在休眠中可能吗 以下是我的代码的简化版本 void save Session sessi
  • 替换实例化类的实现而不触及代码(java)

    我有不想触及的遗留代码 public class LegacyCode public LegacyCode Service s new ClassA s getMessage Where ClassA提供 CORBA 服务调用 public
  • 获取具有不同键的重复值的枚举变量的值

    我有一个 52 张扑克牌的枚举 如下所述 public enum Card AceClubs 11 AceDiamonds 11 AceHearts 11 AceSpades 11 DeuceClubs 2 DeuceDiamonds 2
  • 如何在 Typescript 中深度扁平化界面?

    例如 interface a name string nested lastName string nested age number 我希望它变成 interface b name string lastName string age n
  • iframe 水平滚动无法在 iOS 上呈现

    我正在开发一个 iOS HTML5 Web 应用程序 需要显示一个包含大量文本的大页面 iframe 似乎是正确的工具 因为它允许滚动以在小屏幕上查看内容 使用 iOS 5 和overflow auto webkit overflow sc
  • HBITMAP 到 JPEG /PNG,无需 C++ 中的 CImage

    我有一个 HBITMAP 我想将其保存到 JPEG PNG 流或字节数组中 问题是我使用 mingw 作为编译器 所以我不能使用 CImage 这会让我的生活更轻松 我可以毫无问题地从位图中获取像素 但我不知道如何以 JPEG PNG 格式
  • 在样式化组件中使用 Ant Design 变量

    我在用蚂蚁设计和这个结合样式组件里面的一个GatsbyJS地点 我希望能够访问 Ant Design 变量 它们是用Less 在样式组件内 像这样的事情 const StyledButton styled Button background
  • 如何在WordPress中创建子主题?

    我正在尝试创建一个子主题 以便我可以自定义父主题 但它不起作用 我做了我能想到的一切 为我的子主题创建了一个文件夹wp content themes 创建了一个style css样式表并将其保存在子主题文件夹中 Theme Name Twe
  • 意外的 Class.getMethod 行为

    不久前我有一个类似的问题当使用 Class getMethod 和自动装箱时 在您自己的查找算法中实现它是有意义的 但真正让我有点困惑的是以下内容也不起作用 public class TestClass public String doSo
  • 仅使用 JavaScript 选择随机 HTML 元素

    我正在尝试从 HTML 代码中选择一个元素 然后在 JavaScript 中使用它 需要突出显示 HTML 由一个包含 36 个 td 的表格组成 到目前为止我的代码 var box function getRandom return Ma
  • android获取嵌套在数组中的json数组

    就像是这个问题 如何保存在变量中 但是用这个 json 代码 restarutant name Hotel Raja photo http i imgur com Mzt4u jpg address 93 2ndc ross GDP etx
  • ASP.NET 2 项目共享相同的文件

    正如标题所说 我有 2 个 Web 项目 它们具有相同的 css 文件 母版页和一些资源文件 我如何共享这些文件 atm 我有 2 份 解决方案1 将它们绑定到单独的程序集中 以便在您的项目中共享 参考 使用 Visual Studio 2
  • Java:如何为 TextField 执行“onclick”?

    我想让我的文本字段在有人单击它时清除文本 我怎样才能做到这一点 on java awt TextField你可以添加一个MouseListener like so TextField field new TextField field ad
  • VB6 的 ORM/MDA/UML 工具

    我知道 Rational Rose 我们有 Rational Rose 6 但我正在寻找一些其他更有用的工具 它们不会抱怨它们不能在 Windows 98 2000 中运行 当在 WinXP 中安装和运行时 并且与 Rational Ros
  • MySQL JOIN 忽略 NULL 值

    我有以下带有 JOIN 的 SQL 如果我运行它 它会忽略 users 表中的 group id 中具有 NULL 值的记录 因此 我得到的结果较少 SELECT u user id u email g group name FROM us
  • 使用 Python 将 CSV 文件上传到 Google Cloud Storage

    我需要使用 Python 自动将本地 csv 文件上传到 Google Cloud 存储桶中 我可以使用哪个 Python 库 任何示例代码将不胜感激 我们可以使用google python客户端api将文件上传到google云存储 首先
  • iPhone 5 中的定位服务进入“非活动”状态

    甚至我的应用程序也在后台注册位置更新 在我的代码中 self locationManager desiredAccuracy kCLLocationAccuracyThreeKilometers self locationManager d
  • C中使用scanf()连续读取两个字符

    我正在尝试输入用户的两个字符t次数 这是我的代码 int main int t scanf d t char a b for i 0 i
  • 通过 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas 失败,并显示“'utf-8'编解码器无法解码字节...在位置...:无效的起始字节”

    我正在尝试使用 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas with sftp open path file filename as fp fp aux pd read csv fp separator 但是当
  • 菜单元素的 ListView 信号和槽

    我正在尝试使用自定义元素实现某种自定义菜单 最终目标是创建某种带有文本和图标的弹出菜单 但在创作过程中我遇到了一些问题 我可以展示两个主要问题 有一个带有标题的奇怪菜单元素Hello world在第一个位置 看起来像是读取应用程序窗口的标题