在代码中的哪个位置连接 Qt SIGNALS 和 SLOTS 以获得最佳代码可读性?

Posted

技术标签:

【中文标题】在代码中的哪个位置连接 Qt SIGNALS 和 SLOTS 以获得最佳代码可读性?【英文标题】:In which place in the code to connect Qt SIGNALS and SLOTS for best code readability? 【发布时间】:2013-10-17 06:24:39 【问题描述】:

我开始在 Qt 中编程,并正在寻找关于在代码中何处编写 connect 语句的最佳实践,以便代码更具可读性。

从目前的角度来看,似乎在任意位置定义connect(假设任意位置并不意味着功能差异)会导致代码非常难以阅读。

目前,我找到了在包含 SLOTS 的类的构造函数中定义 connect 语句的最直观方法。

是否有标准或推荐的最佳实践

【问题讨论】:

对于您的主 UI,您通常会有一个初始化所有小部件的函数,不是吗?那不是最好的地方吗? 我不知道有什么推荐的方式。在我的实践中,我安装对象的连接soon after they are defined @paulsm4 我不知道。从当前的角度来看,我想将connect 定义为尽可能接近 SLOTS,以便我可以轻松查看执行操作的信号。所以问题的答案是,是的,但仅适用于 gui 上的 SLOTS。但是,我仍然没有发现这种方法的坏处。 我通常将它们包含在单独的函数中。像setupSignalsSlots() 来设置默认值,对于动态连接,我使用disconnectSignalsSlotsFor<whatever>() 之类的东西来确保所有设备都断开连接,setupSignalsSlotsFor<whatever>() 以我需要的方式再次连接它们......在使用小部件而不是模型/视图并在整个应用程序中使用相同的小部件 【参考方案1】:

我喜欢为我的布局的每个“主要”部分设置一个函数来进行初始化。下面是一个构造函数的例子。每个create 函数都返回一个组框小部件。

MissionConfiguration::MissionConfiguration(QWidget* parent) : QWidget(parent) 

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(createMissionConfigurationGroupBox());
    layout->addWidget(createNetAcquireGroupBox());
    layout->addWidget(createSystemStatus());
    layout->addWidget(createStatusButtons());
    setLayout(layout);

在这些“创建”功能中的每一个中,都连接了适当的信号/插槽。如果小部件很复杂,它可以帮助我保持井井有条。

这是createStatusButtons 函数的示例:

QGroupBox* MissionConfiguration::createStatusButtons() 
    // on the qbutton status
    QGroupBox *runModes = new QGroupBox(tr("Run Modes"));
    QHBoxLayout *runModeLayout = new QHBoxLayout;

    live = new QRadioButton(tr("Live"));
    playback = new QRadioButton(tr("Playback"));
    simulation = new QRadioButton(tr("Simulation"));
    QPushButton *logout = new QPushButton("Logout");

    simulation->setChecked(true);

    connect(recorder, SIGNAL(isConnected(bool)), live, SLOT(setEnabled(bool)));
    connect(recorder, SIGNAL(isConnected(bool)), playback, SLOT(setEnabled(bool)));
    connect(logout, SIGNAL(clicked()), this, SLOT(logout()));

    runModeLayout->addWidget(live);
    runModeLayout->addWidget(playback);
    runModeLayout->addWidget(simulation);
    runModeLayout->addWidget(logout);
    runModes->setLayout(runModeLayout);
    return runModes;

真的,“最好”的做法是你喜欢它的方式以及你容易记住的方式。我建议你想出一个你可以理解的习语,这样以后如果你必须编辑你的代码,你就会知道去哪里找。

【讨论】:

以上是关于在代码中的哪个位置连接 Qt SIGNALS 和 SLOTS 以获得最佳代码可读性?的主要内容,如果未能解决你的问题,请参考以下文章

在 cmake 文件中打开 no_keyword(Qt 选项)以使用 boost::signals

怎么理解QT中的信号与槽

译qt5教程02 -- Signals and Slots

QT5 连接信号到功能

Qt信号和槽的问题

qt 信号导致连接时出现分段错误