【问题标题】:Combine multiple widgets into one in Qt在 Qt 中将多个小部件合并为一个
【发布时间】:2016-10-27 07:02:28
【问题描述】:

我在一个项目中反复使用一对QComboBoxQListWidget。它们的交互是高度耦合的——当在组合框中选择一个项目时,列表会以某种方式被过滤。我正在跨多个对话框实现复制粘贴这两个小部件之间的所有信号和插槽连接,我认为这不是一个好主意。

是否可以创建一个自定义小部件,它将容纳这两个小部件并将所有信号和插槽连接放在一个地方?如下所示:

class CustomWidget
{
    QComboBox combo;
    QListWidget list;

    ...
};

我想将此小部件用作单个小部件。

【问题讨论】:

    标签: c++ qt widget


    【解决方案1】:

    通常的做法是继承QWidget(或QFrame)。

    class CustomWidget: public QWidget {
     Q_OBJECT
    
     CustomWidget(QWidget *parent)
      : QWidget(parent) {
        combo = new QComboBox(...);
        list  = new QListWidget(...);
        // create the appropriate layout
        // add the widgets to it
        setLayout(layout);
     }
    
     private:
      QComboBox *combo;
      QListWidget *list;
    
    };
    

    处理该自定义小部件中列表和组合之间的所有交互(通过将适当的信号连接到适当的插槽,可能为此定义您自己的插槽)。

    然后,您可以通过专用信号和插槽公开自定义小部件的行为/API,可能会模仿列表和/或组合中的那些。

    Address book 教程将引导您完成所有这些,包括创建自定义小部件并为其定义信号和插槽。

    【讨论】:

    • 我阅读了您在回复中链接的地址簿示例,我有一个问题困扰着我:为什么不是所有newly 分配的小部件deleted 都在课堂上'析构函数?我觉得我在这里遗漏了一些非常重要的东西......
    • "当 QObjects 在堆上创建(即用 new 创建)时,可以以任意顺序从它们构造树,之后可以以任意顺序销毁树中的对象。当树中的任意一个QObject被删除时,如果对象有父对象,析构函数会自动从其父对象中移除该对象。如果对象有子对象,析构函数会自动删除每个子对象。没有QObject被删除两次,不分先后顺序破坏。” --> 但是在示例中,通过new 添加的小部件永远不会通过parent...?例如。第 1 部分,标签的定义
    • setLayout 完成树。
    • 那么,在哪种情况下,newly 创建的小部件在析构函数中必须是 deleted?
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2012-08-05
    • 1970-01-01
    • 2021-12-22
    • 2011-04-02
    • 2018-03-08
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多