gpt4 book ai didi

qt - 'QMessageBox::critical':4 个重载中没有一个可以转换所有参数类型

转载 作者:行者123 更新时间:2023-12-02 08:35:17 31 4
gpt4 key购买 nike

每当我的独立线程在特定的 .txt 文件中遇到单词“alert1”时,我想显示一条错误消息。但是我在 mythread.cpp 文件中的 monitorForAlerts() 中得到了上述错误。如果我将它放在 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_2_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"));
}
}

主要.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();
}

最新更新*************< em>***************< em>***************< em>***************< em>***********

嗨兹拉托米尔,我选择接受你的第一个建议。我已经创建了一个线程将发出的信号并将其连接到 QDialog 的插槽。请让我知道我的理解是否正确,因为我不知道在哪里实现 connect(),因为信号是在 mythread.h 中声明的,插槽是在 dialog.h 中声明的。 connect 的连接类型参数是 Qt::QueuedConnection,因此 gui 元素来自不同于主线程的另一个线程。未创建。这个说法正确吗?我该把它放在哪里?

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() 以及在哪个文件中?

最佳答案

第一个参数是问题所在,在你的情况下 this 不是一个好的参数,因为 this 是指向 MyThread 的指针实例,并且 MyThread 不是 QWidget(不是派生自 QWidget)。

要解决这个问题,您可以从主窗口中的一个插槽中显示 QMessageBox::critical(代码中的 Dialog 类,在那里您传递主窗口的实例那是一个 QWidget) 并将该插槽与您从线程发出的信号连接起来,确保 connection type connect 的参数是 Qt::QueuedConnection,这样您就不会尝试从与主线程不同的另一个线程创建 gui 元素。

另一种选择是在启动第二个线程之前验证数据并告诉他需要提供正确文件的用户。

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();
//...

关于qt - 'QMessageBox::critical':4 个重载中没有一个可以转换所有参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343348/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com