- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设有如下QT代码(QT 5.3.1):
void SenderClass::runSignal()
{
emit mySignal();
}
void ReceiverClass::ReceiverClass()
{
...
connect (senderClassRef, SIGNAL(mySignal()), this, SLOT(mySlot()) );
}
void ReceiverClass::mySlot()
{
//Long operation executions
Sleep(1000);
qDebug() << "1";
Sleep(1000);
qDebug() << "2";
Sleep(1000);
qDebug() << "3";
}
连续调用 runSignal() 控制台会显示如下内容:
1 2 1 3 2 3
这两个类在同一个线程中。我必须在插槽中使用 QMutexLocker 吗?或者是否有另一种方法来获得有序输出,例如:
1 2 3 1 2 3
因此,如果仍有一个正在执行,则阻止调用 mySlot() 函数。
更新
下面是一段真实的代码片段。发件人:
//Sender.h
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextBrowser>
class Receiver;
class Sender : public QWidget
{
Q_OBJECT
public:
Sender(QWidget *parent = 0);
QPushButton *pushButton;
QTextBrowser *textBrowser;
Receiver* receiver;
signals:
void buttonClickedSignal();
public slots:
void ButtonClickedSlot();
};
//Sender.cpp
#include "Sender.h"
#include "Receiver.h"
#include <QObject>
Sender::Sender(QWidget *parent)
: QWidget(parent)
{
pushButton = new QPushButton(this);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(150, 30, 75, 23));
pushButton->setText("Button");
textBrowser = new QTextBrowser(this);
textBrowser->setObjectName(QStringLiteral("textBrowser"));
textBrowser->setGeometry(QRect(50, 90, 256, 192));
receiver = new Receiver(this);
QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(ButtonClickedSlot()));
}
void Sender::ButtonClickedSlot()
{
emit buttonClickedSignal();
}
接收者:
//Receiver.h
#include "Sender.h"
class Receiver : QObject
{
Q_OBJECT
public:
Receiver(Sender *sender);
Sender *m_sender;
public slots:
void ReceiverSlot();
};
//Receiver.cpp
#include "Receiver.h"
#include <QObject>
#include <QThread>
#include <QApplication>
Receiver::Receiver(Sender *sender)
{
m_sender = sender;
QObject::connect(m_sender, SIGNAL(buttonClickedSignal()), this, SLOT(ReceiverSlot()), Qt::QueuedConnection);
}
void Receiver::ReceiverSlot()
{
m_sender->textBrowser->append("1");
QThread::msleep(100);
qApp->processEvents();
m_sender->textBrowser->append("2");
QThread::msleep(100);
qApp->processEvents();
m_sender->textBrowser->append("3");
QThread::msleep(100);
qApp->processEvents();
m_sender->textBrowser->append("4");
QThread::msleep(100);
qApp->processEvents();
}
即使设置了 QueuedConnection,快速单击按钮也会导致 QTextBrowser 中的数字不连续。
更新 2
我想要实现的是对 ReceiverSlot 的排队访问。用户可以随意点击按钮(在他想要的时候以任何速度)。 ReceiverSlot 不能错过任何事件。我需要某种事件排队,以便始终执行 ReceiverSlot 中的(长)操作,可能会延迟,但会执行。
最佳答案
摆脱 QApplication::processEvents
并将卡住 GUI 的长操作移至新线程。例如,您可以使用移动到新线程的工作对象。有一个good example of this in the docs .
您还应该阅读 this了解有关 Qt 中线程和事件的更多信息。与您在 forcing event dispatching 中解释的情况完全相同部分:
“通过其他路径”重新进入事件循环时要非常小心:它可能会导致不需要的递归!让我们回到 Button 示例。如果我们在 doWork() 槽中调用 QCoreApplication::processEvents(),并且用户再次点击按钮,doWork() 槽将再次被调用:
通常,您希望避免 QApplication::processEvents
并创建本地事件循环。如果你的代码中有这些,那么你应该重新设计它,这样你就不必使用它们了。
文档中的 Worker 对象示例:
class Worker : public QObject
{
Q_OBJECT
QThread workerThread;
public slots:
void doWork(const QString ¶meter) {
// ...
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
关于c++ - 槽中的 QMutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473563/
我在QPushButton的最后一列中插入了QTableview。使用该按钮,我将使用按钮释放信号和插槽handlebutton(int)删除该特定行。 cpp代码: MainWindow::Main
它编译正常,但这是我运行程序时的错误消息: QObject::connect: Cannot queue arguments of type 'QVector' (Make sure 'QVector
我在 PyQt 中使用 for 循环 连接多个信号/槽。代码如下: # Connect Scan Callbacks for button in ['phase', 'etalon', 'mirror
我正在使用 Qt 创建一个 UI,有两个元素可能存在也可能不存在。此外,他们的 parent 也是不同的元素。但是,一个会影响另一个。 我应该如何以最佳方式构造信号/槽(或者我什至不应该使用该模式)?
我正在为这事兜圈子。就是无法理解信号和插槽。 只是在寻找某种机制,当我的 C++ 中出现信号时可以自动更新我的 UI。 示例: 我在 Qml 中有两个带有文本的标签:返回值的 _app.method。
我有两条路线呈现相同的组件,但来自 API 的数据不同。 该组件有一个名为 的子组件有一个 v-if检查特定插槽是否有内容的指令(因为如果它没有内容,我不希望该插槽显示)。 但是,在同一个父组件上可
我只是问当我的 html 位于 java-script 变量而不是 DOM 本身时如何使用 .each。 如果我有这样的 html: deze this dies 我能做到
基本上,想象一个宽度为 9(从 0 开始)的基于位置的区域 ╔════╦════╦════╦════╦════╦════╦════╦════╦════╗ ║ 0 ║ 1 ║ 2 ║ 3 ║
我想做一些非常简单的事情。单击切换按钮并在 QT 中获取消息框。 cpp: _show_hide_password = new QPushButton( "abc" ); _show_hide_pas
我有一个关于信号和槽的问题。在我的应用程序中,我想将来自一个对象的信号连接到 textEdit在对话框窗口中。我的信号发出 QString ;如果我违反封装(通过将 UI 公开而不是私有(privat
你好我来自java阵营,正在尝试做一个c++程序 我有一个名为 Manifest 的数组,它接收乘客对象 for (int i = 0; i Manifest . 例如 #include #incl
似乎为 Signal 类和插槽中调用的内容提供安全跨线程信号的唯一实现是 QT。 (也许我错了?)。 但是我不能在我做的项目中使用QT。那么我怎样才能从不同的线程(例如使用 Boost::signal
我将直接从示例开始: 在游戏中,有一个袋子供玩家用来存放他们的元素(元素的大小不一),袋子的大小也是可变的。 在一个 8x15 插槽的袋子中,我需要插入一个占用 2x2 插槽的元素,我可以搜索空间来实
PyQt 按钮事件可以以正常方式连接到函数,以便函数接收默认信号参数(在本例中为按钮选中状态): def connections(self): my_button.clicked.connec
访问类槽时,而不是写入 (defmethod get-name ((somebody person) (slot-value somebody 'name)) 是否可以使用点符号(又名 C++),即
我正在使用 vee-validate v3.0 进行验证并且设置很顺利,但现在我正在尝试设置我的元素的样式,但我似乎无法让它工作。我遵循了关于样式的非常简短的文档并编辑了 vee-validate 配
我尝试使用来自 https://wiki.qt.io/QThreads_general_usage 的方法与 moveToThread。一切安好。但是,如果我尝试将参数添加到完成的信号中,则会出现以下
我刚刚使用 iAds 和 adMob 在我的应用程序中实现了 adWhirl。一切都编译正确,adMob 工作完美,但我的 iAd 大小不正确。广告看起来尺寸合适,但实际上似乎被剪掉了。大约 1/4
我正在使用 python 和 PySide 开发 GUI 应用程序。我需要在单独的线程中运行长时间的背景任务。对于线程,我决定根据“正确”的方法使用 QThread,而不是从 if 进行子类化(参见
在用于编写 GUI 代码的 Qt 的 QML 语言中,QML 元素(如果我理解正确的话)在它们变得可见之前不会被实际创建。 (编辑: 听起来这些元素是在 QML 引擎加载它们时创建的,但看起来信号/槽
我是一名优秀的程序员,十分优秀!