如何自动更新状态栏消息? 我使用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中的用途。