'QMessageBox::critical': ни одна из 4 перегрузок не может преобразовать все типы аргументов.

Я хочу отображать сообщение об ошибке всякий раз, когда мой независимый поток встречает слово «alert1» в определенном файле .txt. Но я получаю указанную выше ошибку внутри monitorForAlerts() внутри файла myread.cpp. Строка ожидаемо выполняется, если я поместил ее в dialog.cpp. Итак, я предполагаю, что это связано с отсутствием наследования этого объекта. Не могли бы вы посоветовать мне, как решить эту ошибку для данного кода?

Вот код: диалог.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtCore>
#include "mythread.h"
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

public slots:

private:
    Ui::Dialog *ui;

private slots:
    void on_pushButton_clicked();
    void on_pushButton
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QtCore>
#include <QDebug>
#include <QFile>
#include <Windows.h>
#include <QMessageBox>
#include <QTimer>
#define ALERTS_MESSAGE_STORAGE_PATH "E:\\QT1\\simpleGUIThread2\\simpleGUIThread2\\usbAlert.txt"
#define TIMER_VALUE                      500
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void run();
    QString name;
    void monitorForAlerts();
    int exec();

public slots:

signals:
    void testSignal(QString message);

public slots:

};

#endif // MYTHREAD_H
clicked(); }; #endif // DIALOG_H

мифочит.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QtCore>
#include <QDebug>
#include <QFile>
#include <Windows.h>
#include <QMessageBox>
#include <QTimer>
#define ALERTS_MESSAGE_STORAGE_PATH "E:\\QT1\\simpleGUIThread2\\simpleGUIThread2\\usbAlert.txt"
#define TIMER_VALUE                      500
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void run();
    QString name;
    void monitorForAlerts();
    int exec();

public slots:

signals:
    void testSignal(QString message);

public slots:

};

#endif // MYTHREAD_H

диалог.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    ui->label->show();
}

void Dialog::on_pushButton_2_clicked()
{
    ui->label->hide();
}

мифочит.cpp

#include "mythread.h"
#include "dialog.h"
MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
}

void MyThread::run()
{
    exec();
}

int MyThread::exec()
{
    while(1)
    {
        monitorForAlerts();
        emit(testSignal("hello world!!"));
        sleep(1);
    }
}

void MyThread::monitorForAlerts()
{
    QString response = ALERTS_MESSAGE_STORAGE_PATH;
    QFile resp(response);
    resp.open(QIODevice::WriteOnly);
    resp.close();
    QFile resp1(response);
    char buf[121];
    char buf1[] = "alert1";
    char buf2[] = "alert2";

    resp1.open(QIODevice::ReadOnly);
    while(resp1.size() == 0)
    {
        Sleep(3000);
    }
    qint64 lineLength = resp1.readLine(buf, sizeof(buf));
    resp1.close();
    if(strcmp(buf,buf1) == 0)
    {
        QFile::remove(ALERTS_MESSAGE_STORAGE_PATH);
        qDebug()<<"warning 1!!";
        QMessageBox::critical(this,tr("ERROR"),tr("Large change in illumination.\nPlease re-capture reference image.\n"));
    }
    if(strcmp(buf,buf2) == 0)
    {
        QFile::remove(ALERTS_MESSAGE_STORAGE_PATH);
        qDebug()<<"warning 2!!";
        QMessageBox::critical(this,tr("ERROR"),tr("The camera position has been moved or an object is obscuring its view.\nPlease check the device.\n"));
    }
}

main.cpp

#include "dialog.h"
#include <QApplication>
#include "mythread.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyThread mThread1;
    mThread1.name = "mThread1";
    mThread1.start();

    Dialog w;
    w.show();

    return a.exec();
}

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ************** *************** *************** *************** **********

Привет, Златомир, я решил воспользоваться твоим первым советом. Я создал сигнал, который поток будет излучать, и подключил его к слоту для QDialog. Пожалуйста, дайте мне знать, правильно ли я понимаю, потому что я не знаю, где реализовать функцию connect(), так как сигнал объявлен в файле myread.h, а слот — в файле dialog.h. Аргументом типа подключения для подключения является Qt::QueuedConnection, поэтому элементы графического интерфейса пользователя из другого потока отличаются от основного потока. НЕ создаются. Это утверждение верно? и куда мне это поместить?

connect( mThread, SIGNAL(alertSignal(QString)), this, SLOT(alertSlot(QString)), Qt::QueuedConnection);

мифочит.h

//....
signals:
void alertSignal(QString message);
//....

диалог.h

//....
public slots:
void alertSlot(QString message);
//....

мифочит.cpp

//....
    if(strcmp(buf,buf1) == 0)
    {
        QFile::remove(ALERTS_MESSAGE_STORAGE_PATH);
        qDebug()<<"warning 1!!";
        emit(alertSignal("alert1"));
    }
    else if(strcmp(buf,buf2) == 0)
    {
        QFile::remove(ALERTS_MESSAGE_STORAGE_PATH);
        qDebug()<<"warning 2!!";
        emit(alertSignal("alert2"));
    }

диалог.cpp

void Dialog::alertSlot(QString message)
{
    if(strcmp(message, "alert1"))
        QMessageBox::critical(this,tr("ERROR"),tr("Large change in illumination.\nPlease re-capture reference image.\n"));
    else if(strcmp(message, "alert2"))
        QMessageBox::critical(this,tr("ERROR"),tr("The camera position has been moved or an object is obscuring its view.\nPlease check the device.\n"));
}

Теперь, если бы это было правильно, как мне реализовать connect() и в каком файле?


person cappy0704    schedule 12.03.2014    source источник


Ответы (1)


Первый аргумент - это проблема, в вашем случае this не является хорошим аргументом, потому что this является указателем на экземпляр MyThread, а MyThread не является QWidget (не является производным от QWidget).

Чтобы решить эту проблему, вы можете показать QMessageBox::critical из слота в главном окне (класс Dialog в вашем коде, там вы передаете экземпляр основного окна, который является QWidget) и соедините этот слот с сигналом, который вы испускаете из своего потока, сделайте убедитесь, что аргумент типа подключения для connect равен Qt::QueuedConnection, чтобы вы не пытались создавать элементы графического интерфейса. из другого потока, отличного от основного потока.

Другой вариант — проверить данные перед запуском второго потока и сообщить пользователю, что ему нужно предоставить правильные файлы.

LE: Также проверьте рекомендуемый способ в документации QThread. использовать класс, теперь рекомендуется не наследоваться от QThread.

LE2 — ответ на обновление. Это соединение может быть выполнено везде, где у вас есть два экземпляра, которые вы хотите подключить, в вашем случае main.cpp — это хорошее место для их подключения (не забудьте указать полное имя для подключения: QObject::connect ):

//...
    MyThread mThread1;
    mThread1.name = "mThread1";
    mThread1.start();

    Dialog w;
    QObject::connect( &mThread1, SIGNAL(alertSignal(QString)), &w, SLOT(alertSlot(QString)), Qt::QueuedConnection);
    w.show();
//...
person Zlatomir    schedule 12.03.2014