- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每当我的独立线程在特定的 .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/
我学习 PyQt5(这对我来说看起来很复杂),我想知道为什么 QMessageBox.Yes(或否)有一些特殊的值(value),对我来说它是 16384。这就是我的意思: from PyQt5 im
我似乎发现了 Qt 5.1 的一个烦人的问题。 假设你有一个系统托盘图标(QSystemTrayIcon)并且你隐藏了你的表单(QDialog),所以: this->hide(); 然后,当表单隐藏时
import time import sys, threading from PyQt4 import QtGui, QtCore from PyQt4.QtGui import QApplicati
我创建了一个与全屏应用程序一起运行的程序。我希望我的程序中的 QMessageBox 显示在全屏运行的应用程序的顶部。 平台是 Windows 7,我使用的是 Qt。 我试过了: QMessageBo
我需要显示简单的错误消息 QMessageBox::critical( nullptr, "My Title", "Text"); 但是对话框显示为空标题。 我做错了什么? PS:操作系统:MacO
我正在构建一个 Qt Symbian 项目,我想向用户显示应在几秒钟后自动关闭的通知。我已经看到诺基亚在他们的用户界面中经常使用它。 现在我正在使用下面的代码,以便用户可以关闭 QMessageBox
如何显示带有三角形感叹号符号的 QMessageBox::warning,如下所示? 我在QMessageBox::warning中找不到任何选项,我只得到红色的圆形符号。 最佳答案 三角形图标应该是
尽管设置了 setStandardButtons(0);它不会关闭 msgBox。 QMessageBox msgBox; msgBox.setText("My List"); msgBox.setS
我想创建一个简单的“关于”对话框,但注意到 QMessageBox::about 不会根据标题的长度调整其大小(由于字体较大,标题通常会更长...... .至少在我的桌面环境中),仅针对内容。有没有办
有没有办法显示一个具有可选择文本的QMessageBox,以便用户能够使用鼠标或键盘以某种方式选择和复制其内容?我知道我可以创建做到这一点的标签,但不确定消息框。 MS Windows 中的标准消息框
我想在计算时使用QMessageBox来阻止其父QDialog。我遇到了类似的事情,但这不起作用。 msgBox = QtWidgets.QMessageBox() msgBox.setWindowT
我正在使用 Qt 框架,但对它有点生疏。 我有两个 QStrings first 和 last 我想在 QMessageBox 中显示它们,但不知道如何包含多个参数。 这就是我必须用 on 参数对其进
我有一个看似简单的任务,但我正在疯狂地尝试解决这个问题。 我正在尝试编写 C++ QT 程序。我需要做的就是在 QMessageBox 中显示一些信息。我在与我的程序相同的目录中有一个文本文件,其中包
基本上我正在学习 Qt C++ 的基础知识,我试图同时打开两个不同的 QMessageBox,但它们相互重叠。我想知道是否有可能将它们并排放置。非常感谢任何关于如何这样做的意见。 额外信息:我使用 Q
我想使用 QMessageBox 向用户宣布一个短暂的等待间隔。 QMessageBox* box(new QMessageBox(QMessageBox::Information,"Parser",
我使用的是 Ubuntu Linux。我使用了 pyuic4 命令并创建了一个 .py 文件,然后向其中添加了一个消息框。如下所示: from PyQt4 import QtCore, QtGui t
我在 QMessageBox 上通过 QMessageBox::addButton() 方法添加了 3 个按钮。如果单击按钮,是否可以防止关闭消息框?默认情况下,每个按钮都会关闭窗口,但我不想为一个按
#include int main(int argc, char** argv) { QApplication app(argc, argv); // first QMess
我有一个问题,对你们中的一些人来说答案很明显,但我就是想不出来。 QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html有两种显示方式,
我正在尝试通过在 lambda 函数中调用其 show 函数来显示 QMessageBox,如下所示: connect(ui->graphButton, &QAbstractButton::click
我是一名优秀的程序员,十分优秀!