有没有办法使用Qt发送信号或任何其他方式来判断USB串口线是否已拔下?
枚举对我不起作用.
Q_ENUMS()Q_OBJECT宏qmlRegisterType()简而言之,一切都是"按书",但由于某种原因,我继续获得undefinedQML中的每一个枚举.我错过了什么吗?
class UI : public QQuickItem {
Q_OBJECT
Q_ENUMS(ObjectType)
public:
enum ObjectType {
_Root = 0,
_Block
};
...
};
Run Code Online (Sandbox Code Playgroud)
...
qmlRegisterType<UI>("Nodes", 1, 0, "UI");
Run Code Online (Sandbox Code Playgroud)
...
import Nodes 1.0
...
console.log(UI._Root) // undefined
Run Code Online (Sandbox Code Playgroud)
编辑:另请注意,注册的枚举确实可用于元系统,由于某些原因它们不能用于QML.
更新:我刚刚发现了这个错误:https://bugreports.qt.io/browse/QTBUG-33248
但是与那个错误不同,我的root组件是一个UI不是自定义元素UI的根目录.
事实证明,实际上可以使用QML形式的枚举值console.log(),以下代码实际上正在工作.
class A : public QObject {
Q_OBJECT
Q_ENUMS(EA)
public:
enum EA {
EA_NULL = 0,
EA_ONE
};
};
class B : public A …Run Code Online (Sandbox Code Playgroud) 我发现了一些类似的问题,但这些问题似乎是指在插槽处理程序中使用消息框的情况。就我而言,我有点卡住,因为即使我的插槽处理程序什么也不做,但我两次都收到了editFinished信号。
为了进行测试,我有一个QLineEdit数组,该数组使用signalMapper将editFinished()信号连接到单个插槽。signalMapper传递数组索引,这样我就可以看到信号的来源。例如:
testenter::testenter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testenter)
{
// setup the UI according to the .h file
ui->setupUi(this);
signalMapper = new QSignalMapper(this);
// init the labels and edit boxes
for (int i = 0; i < 10; i++)
{
pm_label[i] = new QLabel(ui->scrollArea);
QString text = QString("Number %1").arg(i);
pm_label[i]->setText(text);
pm_label[i]->setGeometry(10,20+i*30, 50, 20);
pm_label[i]->show();
pm_editBox[i] = new QLineEdit(ui->scrollArea);
pm_editBox[i]->setGeometry(80,20+i*30, 50, 20);
pm_editBox[i]->show();
signalMapper->setMapping(pm_editBox[i], int(i));
connect(pm_editBox[i], SIGNAL(editingFinished()), signalMapper, SLOT(map()));
}
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(data_entry(int)));
}
void testenter::data_entry(int entry)
{
//dummy
} …Run Code Online (Sandbox Code Playgroud) Qt,似乎用一个首字母命名其他所有内容Q,这样做:#define signals signalsin qobjectdefs.h.
然而,GStream,不是很自然,不会想象signals成为一个保留字并做到这一点
struct _GDBusInterfaceInfo
{
/*< public >*/
volatile gint ref_count;
gchar *name;
GDBusMethodInfo **methods;
GDBusSignalInfo **signals; <==================
GDBusPropertyInfo **properties;
GDBusAnnotationInfo **annotations;
};
Run Code Online (Sandbox Code Playgroud)
在gdbusintrospection.h.
我只是假设Qt和GStreamer不能很好地一起玩,或者有没有办法解决这个问题?
注意:#define signals signals如果我没有,可以说服Qt #define Q_MOC_RUN.但是这会导致正在使用的类出现问题
class
{
public:
// stuff
signals:
// stuff
private:
// stuff
};
Run Code Online (Sandbox Code Playgroud)
正如您现在可能已经猜到的那样,我正在尝试从不在身边的人那里接管代码并且谷歌不是我的朋友:-(
[更新]谢谢,@ IpApp的提示(这是行不通的,唉).
我被给了别人的代码.显然它是为目标构建的,但从来没有为单元测试而构建,我必须这样做(为什么他混合和匹配,我不知道).
当我在Eclipse CDT中使用QT_NO_KEYWORDS时,我得到错误,因为类定义代码不使用Q_SINGAL(S) - 它使用信号宏(现在定义为信号)来定义某些公共成员.
我不允许改变subsytsem代码,只是为了模拟它的接口,但我不愿意模仿所有的Qt和Glib,因为努力.
也许有一种方法可以将库用于其中一种,而不是将它们的目录包含在源路径中?
QNetworkAccessManager可以异步执行请求,并time.sleep(secs)可以暂停执行给定的秒数.我对以下代码感到困惑.是t2这里总是超过10秒?
如果不在time.sleep(secs)此处使用代码,则getWebPageSRC在固定的时间内调用完成的插槽,大约大约3秒.
我现在已经测试了几次,发现t2总是大于10秒.有谁能解释为什么?
de myMethod(self):
...
reply.finished.connect(self.getWebPageSRC)
self.t=time.clock()
time.sleep(10)
def getWebPageSRC(self):
t2=time.clock()-self.t
print(t2)
Run Code Online (Sandbox Code Playgroud)
PS,因为QNAM异步工作,我认为它在另一个线程中工作,因此有自己的事件循环,所以time.sleep(secs)挂起所有线程的所有Qt事件循环或只是它内部的线程的事件循环?在主线程中休眠会挂起所有其他线程的事件循环吗?
我有一个C ++类,并且可以在QML中创建它。然后我在QML中有一个信号,该信号具有代表该对象的参数。我正在使用,QtQml.StateMachine并且正在使用捕获触发信号SignalTransition。我希望能够将我的信号参数设置为下一个状态SignalTransition触发。在代码中:
这是我的信号在Model.qml中的样子:
signal mySignal(CustomObject customObject)
Run Code Online (Sandbox Code Playgroud)
我在State.qml中的信号转换代码:
import QtQml.StateMachine 1.0 as SM
// SM.State { ...
Model {
id: model
// ...
}
SM.SignalTransition {
targetState: nextState
signal: model.mySignal
onTriggered: console.log(customObject) // error here
}
// ... }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:ReferenceError: customObject is not defined。当我发出信号时,我将我的customObject作为信号的参数传递。
我想在Qt中发送一个带有信号的结构.我怎样才能做到这一点?我知道如何用信号发送整数,字符串,图像等,但与结构部分混淆.我读了一些帖子,发现了Q_DECLARE_METATYPE(),但我不明白如何使用它.
typedef struct
{
int EmpId;
QString Name;
} StandardData;
class Data::public QObject
{
Q_DECLARE_METATYPE(StandardData);
signals:
void SignalData(const StandardData &f_objStandardCan);
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误1.非命名空间范围类中的显式特化.2.模板的专用化必须出现在命名空间范围3中.struct QMetaTypeId使用不同的访问权重新声明.有人可以告诉我哪里出错了.
在以下函数中,管理器将发出finished(QNetworkReply*)信号,然后getCategories(QNetworkReply*)将调用插槽函数.
void getCategories()
{
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getCategories(QNetworkReply*)));
for(int i = 0; i < stores.size(); ++i)
{
request.setUrl(QUrl(QString("http://www.example.com/%1").arg(stores[i].store_id)));
manager.get(request);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在第一次调用slot函数时发出第二个信号,Qt是否会启动另一个线程来运行slot函数作为对第二个信号的响应?如果是这样,是否有一些方法让第二次调用slot函数等到第一次调用结束?
更新:
我的意思是插槽功能有可能同时运行吗?
我正在 Qt 4.7 中的一个项目中工作,其中有一个QListWidget需要在选择列表中的项目时执行特定功能的项目。特定的函数在这里并不重要,所以对于这个例子,我们假设它将值打印到std::cout. 我现在拥有它,以便在双击某个值时执行此操作,如下所示:
connect(ui->myList, SIGNAL(doubleClicked(QModelIndex)),
this, SLOT(printChoice(QModelIndex)));
...
void MyClass::printChoice(QModelIndex index)
{
std::cout << ui->myList->model()->data(index).toString();
}
这段代码完美运行。然而,我的项目负责人表示,他们希望当用户单击该键时,为当前选择的列表中的任何行输入此插槽F2。我不知道这些键发出的任何信号,并且在网络上查找也没有多大帮助。有谁知道有什么方法可以做到这一点?谢谢!
编辑:我发现F2在选择一个值时点击会自动将该行置于编辑模式(它必须内置到 Qt 中),但我仍然需要知道发生这种情况时如何触发插槽。
编辑2:我越来越接近了。MyClass我发现我可以在call中创建一个插槽keyPressEvent(QKeyEvent *event),每当按下某些键(包括 fX 键)时就会注册。但是,我仍然找不到一种方法来区分哪个键触发了它,以及如何确保它是F2
我正在查看Qt文档.有一种快速而肮脏的方法来获取窗口小部件可以发出的所有信号的列表.
例如(withPyQt):
allSignalsList = thisWidget.getSignals()
Run Code Online (Sandbox Code Playgroud)
或者,新的Qt5 API上有一个很好的位置,它显示给定QObject的所有信号吗?