Защо получавам необектен тип 'char *(const char *, int) throw()' не може да се присвоява

Приложих минимален проверим пример по-долу, който репликира проблема. Проблемът, който имам, е, че след като обратното броене от QLabel пристигне до 00:00, бих искал приложението да се изключи автоматично. Но това не се случва и получавам от компилатора следната грешка:

non-object type 'char *(const char *, int) throw()' is not assignable

Под минималния примерен код за проверка cdw

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, може да е проста грешка, но малко се обърквам.

Благодаря, че посочихте правилната посока за решаване на този проблем.


person Emanuele    schedule 09.06.2020    source източник
comment
Имате ли грешка при компилиране или трябва да стартирате програмата, за да получите грешката?   -  person Guillaume Racicot    schedule 09.06.2020
comment
Какво е index? И каквото и да е, какво мислите, че трябва да означава if (&index)?   -  person Mat    schedule 09.06.2020
comment
По принцип се опитвам да уловя 00:00 от обратното броене и ако това е вярно, изключете приложението. С index се опитвам да хвана 00:00.   -  person Emanuele    schedule 09.06.2020
comment
@GuillaumeRacicot, да, получавам грешка при компилация: добавих грешката към въпроса   -  person Emanuele    schedule 09.06.2020


Отговори (2)


Изглежда, че имате някакъв код, който изглежда така:

Ако сте прочели документацията на Qt за QLabel::setText правилно, вие ще видя, че има проблем с представения от вас код.

В документацията на Qt се казва, че setText връща void. С други думи, тази функция не връща нищо.

И все пак се опитвате да получите резултата от функцията за тестване в израза if:

//          call to setText
//  v-----------------------------v
if (ui->countDown->setText("00:00")) {
    // ...            
}

Това, което компилаторът вижда, е нещо подобно:

if (/* expression that returns void */) {
    // ...            
}

Това не е валидно. Не можете да направите if (void()). Какво изобщо би направило?

Каквото и да се опитвате да тествате с този оператор if, ще трябва да се направи по друг начин.


Ще се опитам да отгатна какво се опитвате да направите за следното, така че може да е по-малко точно.

Предполагам, че се опитвате да тествате дали обратното броене е равно на 00:00, за да изключите. Нека ти помогна там.

Искате да изпълните нещо, когато таймерът приключи. Това трябва да се направи във вашата членска функция за актуализиране на таймера:

void MainWindow::timerUpdate()
{
    time = time.addSecs(-1);
    ui->countDown->setText(time.toString("mm:ss"));

    // Check if we have a zero time on this tick
    if (time == QTime(0, 0)) {
        // put your code into the shutdown_function to make the shutdown
        shutdown_function();
    }
}

Тук във всяка отметка проверяваме дали времето е равно на нулево време. Когато е така, пристъпваме към изпълнение на функцията за изключване.

person Guillaume Racicot    schedule 09.06.2020
comment
Благодаря, предположението ви е 1001% правилно! Точно това се опитвах да направя и вашето предложение проработи. Също така благодаря, че посочихте, че наричам празно изявление. Разбирам какво съм направил грешно! :) Благодаря за отделеното време. Много оценявам! - person Emanuele; 09.06.2020

Забравихте да декларирате index като променлива.

Има функция index някъде в обхвата и вашият компилатор смята, че се опитвате да й присвоите, което не можете да направите.

Освен това if (&index) няма смисъл, тъй като всяка променлива, която съществува, има ненулев адрес.

Предлагам ви да прегледате документацията на вашата библиотека за setText, за да видите каква стойност връща и как да използвате тази стойност, ако изобщо върне стойност (което би било странно за сетер).

person Asteroids With Wings    schedule 09.06.2020
comment
Здравейте и благодаря, че прочетохте въпроса. Опитах се да променя според вашето предложение и нещата се подобриха малко. Сега имам малка грешка. Добавих EDIT_2 към въпроса, показвайки какво съм направил. Най-вече действах на конструктора - person Emanuele; 09.06.2020
comment
Все още не виждам никаква декларация за променлива с име index. - person Asteroids With Wings; 09.06.2020
comment
за декларацията първоначално опитах това: auto index = ui->countDown->setText("00:00"); което ми даде това, затова се опитах да имам допълнителен начин - person Emanuele; 09.06.2020
comment
@Emanuele Това означава, че setText има върнат тип void, т.е. не връща нищо. Какво се надявате да бъде index? За да повторите, трябва да се консултирате с документацията за тази setText функция, за да разберете как да я използвате. - person Asteroids With Wings; 09.06.2020
comment
да, основно улавям, когато setText от QLabel е 00:00, което означава, когато обратното броене достига до 0 (или индекса, който се опитвам да хвана). След това изключете приложението. - person Emanuele; 09.06.2020
comment
Зададох го на 00:00, защото се опитвах да кодирам твърдо стойността, за да видя дали това работи, но все пак не става. - person Emanuele; 09.06.2020
comment
Добре, тогава наистина не ми е ясно какво се опитвате да направите. Трябва да прочетете документацията и някои примери според мен. - person Asteroids With Wings; 09.06.2020