繁体   English   中英

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

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

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

显示在文件mainwindow.cpp Window类中mainwindow.cpp

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的值并使用RefreshInfoSection作为RefreshInfoSection更新在MainWindow定义的部分,因为有一种方法可以更新该部分和QLabel

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

任何想法/例子。

什么是m_device m_device负责将m_device通知他人。 如果可能的话,向m_device添加一个信号ChangeInBytes ,然后使用以下大致方式将感兴趣的各方连接到该信号:

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

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

您无法监视变量,需要变量的设置器(如建议的那样),发出信号或在变量本身上进行某种类型的池化以检测更改,但这可能会过大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM