Приложих минимален проверим пример по-долу, който репликира проблема. Проблемът, който имам, е, че след като обратното броене от QLabel
пристигне до 00:00
, бих искал приложението да се изключи автоматично. Но това не се случва и получавам от компилатора следната грешка:
non-object type 'char *(const char *, int) throw()' is not assignable
Под минималния примерен код за проверка
mainwindow.h
#include <QMainWindow>
#include <QTime>
#include <QTimer>
#include <QProcess>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void stopAtZeroCountDown();
public slots:
void timerUpdate();
private:
Ui::MainWindow *ui;
QTimer *timer;
QTime time;
QProcess *stopAtZero;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
stopAtZeroCountDown();
ui->countDown->setText("1:00");
time.setHMS(0,1,0);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::stopAtZeroCountDown()
{
this->stopAtZero = new QProcess(this);
this->stopAtZero->setProcessChannelMode(QProcess::MergedChannels);
connect(this->stopAtZero, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[this](int exitCode, QProcess::ExitStatus exitStatus){
qDebug() << "[EXEC] FINISHED: " << exitCode << exitStatus;
index = ui->countDown->setText("00:00"); // <-- Error here
if(&index)
{
this->stopAtZero->start(QStringLiteral("/bin/sh"), QStringList() << QStringLiteral("/path/to/shutdown_executable.sh"));
};
});
}
void MainWindow::timerUpdate()
{
time = time.addSecs(-1);
ui->countDown->setText(time.toString("mm:ss"));
}
Под грешката при компилиране, а също и тук
/home/emanuele/catkin_docking_ws/src/lidarlauncher/src/lidarlauncher/mainwindow.cpp: In lambda function: /home/emanuele/catkin_docking_ws/src/lidarlauncher/src/lidarlauncher/mainwindow.cpp:113:40: error: could not convert ‘this->MainWindow::ui->Ui::MainWindow::<anonymous>.Ui_MainWindow::labelCountDown->QLabel::setNum(0)’ from ‘void’ to ‘bool’ if(ui->labelCountDown->setNum(00))
EDIT_2
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//ui->countDown->setText(time.toString("hh:mm:ss"));
ui->countDown->setText("1:00");
//ui->countDown->setText(time.toString("mm:ss"));
time.setHMS(0,1,0);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(1000);
connect(this->stopAtZero, &QProcess::readyReadStandardOutput, [this, script = this->stopAtZero](){
QString s = QString::fromUtf8(script->readAll());
qDebug() << "[EXEC] DATA: " << s;
if (ui->countDown->setText("00:00")) { // <-- error here
this->stopAtZero->start(QStringLiteral("/bin/sh"), QStringList() << QStringLiteral("/home/emanuele/catkin_docking_ws/src/lidarboatsproject/stop_lidar_deck_and_gui.sh"));
}
});
}
Досега се консултирах със следния източник, за да ми помогне да реша проблема, но без успех . Знам, че проблемът е причинен от присвояване, което трябва да бъде QString
, тъй като се опитвам да уловя 00:00
формата на таймера.
Също така се консултирах с това, това и това са ясни примери за мен , с единствената разлика, че тук използвам qt компоненти като в този случай QLabel
, може да е проста грешка, но малко се обърквам.
Благодаря, че посочихте правилната посока за решаване на този проблем.
index
? И каквото и да е, какво мислите, че трябва да означаваif (&index)
? - person Mat   schedule 09.06.202000:00
от обратното броене и ако това е вярно, изключете приложението. Сindex
се опитвам да хвана00:00
. - person Emanuele   schedule 09.06.2020