如何将操作连接到 C++/Qt 中的值更改

How to connect an action to a value change in C++/Qt

本文关键字:Qt C++ 操作 连接      更新时间:2023-10-16

我确实有一个问题。我目前正在开发一个应用程序,此应用程序正在报告设备上的可用空间。

显示是在我的文件mainwindow.cppWindow类中完成

void MainWindow::createInfoSection()
{
    uint64_t space;
    CreateInfoSection = new QWidget();
    CreateInfoSection->setFixedHeight(40);
    QGridLayout *CreateInfoLayout = new QGridLayout(CreateInfoSection);
    NbOfItemsLabel = new QLabel(tr("%1 Files").arg(m_device.getNbOfFiles()));
    space = m_device.getAvailableFreeSpaceInBytes();
    if(space < MEGABYTE)
        SpaceAvailLabel = new QLabel(tr("%1 KB Remaining").arg(space/KILOBYTE));
    else if (space < GIGABYTE)
        SpaceAvailLabel = new QLabel(tr("%1 MB Remaining").arg(space/MEGABYTE));
    else
        SpaceAvailLabel = new QLabel(tr("%1 GB Remaining").arg(space/GIGABYTE));
    CreateInfoLayout->addWidget(NbOfItemsLabel, 0,0);
    CreateInfoLayout->addWidget(SpaceAvailLabel, 0,1);
    CreateInfoLayout->setAlignment(Qt::AlignCenter);
}

我有第二种方法可以在需要时更新该部分

void MainWindow::RefreshInfoSection()
{
    uint64_t space;
    NbOfItemsLabel = new QLabel(tr("%1 Files").arg(m_device.getNbOfFiles()));
    space = m_device.getAvailableFreeSpaceInBytes();
    if(space < MEGABYTE)
        SpaceAvailLabel = new QLabel(tr("%1 KB Available").arg(space/KILOBYTE));
    else if (space < GIGABYTE)
        SpaceAvailLabel = new QLabel(tr("%1 MB Available").arg(space/MEGABYTE));
    else
        SpaceAvailLabel = new QLabel(tr("%1 GB Available").arg(space/GIGABYTE));
}

可用空间来自我使用 m_device 访问的另一个类中声明的方法。 getAvailableFreeSpaceInBytes在我的mtp_wrapper课中定义如下(mtp_wrapper.cpp)

uint64_t mtp_wrapper::getAvailableFreeSpaceInBytes() {
    return PulsDeviceMngr->device->storage->FreeSpaceInBytes;
}

PulsDeviceMngr是一个包含多个元素的结构。

我正在寻找的是一种检测更改/更新FreeSpaceInBytes值并更新MainWindow中定义的部分的方法,RefreshInfoSection到期使用RefreshInfoSection有办法更新部分并QLabel

我很确定可以通过CONNECT/SLOT/SIGNAL来完成

任何想法/例子。

什么是m_devicem_device有责任将变化通知他人。如果可能,将信号ChangeInBytes添加到m_device,然后大致使用以下方法将相关方连接到该信号:

connect(SIGNAL(m_device->ChangeInBytes), SLOT(interested_party->slot))

如果无法修改m_device,则可能应该创建一个包装类,以适当的方式检查更改。

您无法监视变量,您需要变量的设置器,按照建议发出信号,或者对变量本身进行某种池化以检测更改,但这可能是矫枉过正。