Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何自动更新状态栏消息? 我使用QT5.151和C++创建一个简单的应用程序,它处理来自硬件的信号,显示图像和驱动程序状态。我想在另一个类中定义的int值更改时更新statusbar消息。我希望每次该值更改时自动执行此操作。我知道我需要信号和插槽来实现这一点。到目前为止,我已经做了以下工作:_C++_Qt_Statusbar - Fatal编程技术网

如何自动更新状态栏消息? 我使用QT5.151和C++创建一个简单的应用程序,它处理来自硬件的信号,显示图像和驱动程序状态。我想在另一个类中定义的int值更改时更新statusbar消息。我希望每次该值更改时自动执行此操作。我知道我需要信号和插槽来实现这一点。到目前为止,我已经做了以下工作:

如何自动更新状态栏消息? 我使用QT5.151和C++创建一个简单的应用程序,它处理来自硬件的信号,显示图像和驱动程序状态。我想在另一个类中定义的int值更改时更新statusbar消息。我希望每次该值更改时自动执行此操作。我知道我需要信号和插槽来实现这一点。到目前为止,我已经做了以下工作:,c++,qt,statusbar,C++,Qt,Statusbar,信号处理 class SignalProcessing: public QObject { Q_OBJECT public: SignalProcessing(QObject *parent = nullptr); private: int status; public slots: int GetStatus(); signals: void StatusChanged(); } 信号处理 SignalProcessing::SignalProcess

信号处理

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
private:
    int status;
public slots:
    int GetStatus();
signals:
    void StatusChanged();
}
信号处理

SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::GetStatus()
{
    emit(StatusChanged());
    return status;    
}
SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::getStatus()
{
    return status;    
}
void SignalProcessing::setStatus(int value)
{
    if (status != value)
    {
        status = value;
        emit statusChanged();
    }
}
主窗口

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
public slots:
    void updateStatus();
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    ui->statusbar->showMessage(QString::number(signalProcessing->GetStatus()));
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    connect(signalProcessing, &SignalProcessing::statusChanged, this, &MainWindow::updateStatus);
    updateStatus();
}

void MainWindow::updateStatus()
{
    ui->statusbar->showMessage(QString::number(signalProcessing->getStatus()));
}
问题在于,状态栏消息当前未自动更新,而是设置为给定值


如何确保它始终显示当前状态?

这样做的目的是希望在值实际更改时发出
StatusChanged
信号,而不是在调用
GetStatus()
时。因此,您需要一个SetStatus()函数,您的信号处理类需要知道何时调用该函数。然后,您希望将该信号连接到一个插槽,然后更新您的状态栏。它可能看起来像这样:

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
    int getStatus();
    void setStatus(int value);
private:
    int status;
signals:
    void statusChanged();  // It's better to start signals with a lower case letter
}
信号处理

SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::GetStatus()
{
    emit(StatusChanged());
    return status;    
}
SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::getStatus()
{
    return status;    
}
void SignalProcessing::setStatus(int value)
{
    if (status != value)
    {
        status = value;
        emit statusChanged();
    }
}
主窗口

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
public slots:
    void updateStatus();
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    ui->statusbar->showMessage(QString::number(signalProcessing->GetStatus()));
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    connect(signalProcessing, &SignalProcessing::statusChanged, this, &MainWindow::updateStatus);
    updateStatus();
}

void MainWindow::updateStatus()
{
    ui->statusbar->showMessage(QString::number(signalProcessing->getStatus()));
}

首先更改信号声明,以便提供新值:

类信号处理:公共QObject
{
Q_对象
公众:
信号处理(QObject*parent=nullptr);
私人:
智力状态;
公众时段:
int setStatus(int值);
信号:
无效状态已更改(常量字符串和消息);
}
无效信号处理::设置状态(int值)
{
如果(状态!=值)
{
状态=价值;
发射状态已更改(tr(“状态为%1”).arg(状态));
}
}

然后将此信号连接到插槽,您就完成了。

实际上,这可以通过使用来实现。您必须将
StatusChanged
信号连接到更新状态栏的插槽。这是否意味着来自信号处理类的信号和MainWindow类中的插槽?我知道QStatusBar有一个名为“showMessage”的公共插槽,它适合这个用途。如何确保值通过信号传递?在
SignalProcessing
MainWindow
之间建立连接是最简单的解决方案。如果参数类型匹配,可以直接连接到showMessage。谢谢@JarMan,这是我一直在做的事情,它与Qt文档中给出的示例一致。但是,我必须在信号处理代码中做些错误的事情,因为状态没有更新,即使我强制使驱动程序设置失败或故意将状态值设置为某个整数(例如-1)。您包括了对
connect
的调用?是的。通过调试我可以观察到,在这个过程中没有调用setStatus()方法,应该是发出statusChanged()信号的对象。我相信这是因为我没有在SignalProcessing类的任何地方调用setStatus()方法。相反,我只为status int分配一个值(示例):status=mcgetparamit(channel、MC_appeased_Pg和elapsedPages);好的,只要值发生变化,就由您调用setStatus。好的!明白了:)谢谢你的解决方案!我发现要实现我所需要的,我必须在很多地方调用setStatus()方法,我认为这可能会影响性能,我觉得这不是一个优雅的解决方案。我可能不得不重新考虑这个状态栏在我的UI中的用途。