Почему я получаю необъектный тип '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