C++;信号未在QML侧捕捉到 我在代码> QML中检查了 Qt C++信号。这是我的UeSettings课程标题: #ifndef UESETTINGS_H #define UESETTINGS_H #include <QObject> #include <QSqlDatabase> #include <QString> #include <QStringList> #include <QDebug> #include <QSqlQuery> #include <QSqlError> #include <QDir> #include <QDateTime> #include "uedefaults.h" #include "models/ueprintersmodel.h" #include "uetypes.h" /** * @brief The UeSettings class */ class UeSettings : public QObject { Q_OBJECT private: /** * @brief m_ueServerAddress */ QString m_ueServerAddress; /** * @brief m_ueServerPort */ QString m_ueServerPort; /** * @brief m_ueDatabaseName */ QString m_ueDatabaseName; /** * @brief m_ueDatabaseUsername */ QString m_ueDatabaseUsername; /** * @brief m_ueDatabasePassword */ QString m_ueDatabasePassword; /** * @brief m_ueHostname */ QString m_ueHostname; /** * @brief m_ueNumberOfTopSalesProductsShown */ QString m_ueNumberOfTopSalesProductsShown; /** * @brief m_ueDb */ QSqlDatabase m_ueDb; /** * @brief m_ueAutomaticStockUpdateFromFirstWarehouse */ bool m_ueAutomaticStockUpdateFromFirstWarehouse; /** * @brief m_ueAutoLogoffWorkerAtBill */ bool m_ueAutoLogoffWorkerAtBill; /** * @brief m_uePrintersModel */ UePrintersModel* m_uePrintersModel; /** * @brief ueSetServerAddress * @param address */ inline void ueSetServerAddress(const QString& address) { this->m_ueServerAddress=address; } /** * @brief ueSetServerPort * @param port */ inline void ueSetServerPort(const QString& port) { this->m_ueServerPort=port; } /** * @brief ueSetDatabaseName * @param dbName */ inline void ueSetDatabaseName(const QString& dbName) { this->m_ueDatabaseName=dbName; } /** * @brief ueSetDatabaseUsername * @param dbUsername */ inline void ueSetDatabaseUsername(const QString& dbUsername) { this->m_ueDatabaseUsername=dbUsername; } /** * @brief ueSetDatabasePassword * @param dbPassword */ inline void ueSetDatabasePassword(const QString& dbPassword) { this->m_ueDatabasePassword=dbPassword; } /** * @brief ueSetNumberOfTopSalesProductsShown * @param topN */ inline void ueSetNumberOfTopSalesProductsShown(const QString& topN) { this->m_ueNumberOfTopSalesProductsShown=topN; } /** * @brief ueSetHostname * @param hostname */ inline void ueSetHostname(const QString& hostname) { this->m_ueHostname=hostname; } /** * @brief ueSetAutomaticStockUpdateFromFirstWarehouse * @param automaticStockUpdate */ inline void ueSetAutomaticStockUpdateFromFirstWarehouse(const bool& automaticStockUpdate) { this->m_ueAutomaticStockUpdateFromFirstWarehouse=automaticStockUpdate; } /** * @brief ueSetAutoLogoffWorkerAtBill * @param automaticLogoffWorkerAtBill */ inline void ueSetAutoLogoffWorkerAtBill(const bool& automaticLogoffWorkerAtBill) { this->m_ueAutoLogoffWorkerAtBill=automaticLogoffWorkerAtBill; } /** * @brief uePrintersModel * @return */ inline UePrintersModel* uePrintersModel() const { return this->m_uePrintersModel; } /** * @brief ueSetPrintersModel * @param printersModel */ inline void ueSetPrintersModel(UePrintersModel* const printersModel=0) { this->m_uePrintersModel=printersModel; } /** * @brief ueDatabase * @return */ QSqlDatabase ueDatabase() { return this->m_ueDb; } /** * @brief ueSetDatabase * @param database */ void ueSetDatabase(const QSqlDatabase& database) { this->m_ueDb=database; } /** * @brief ueCreateDatabase * @return true if settings database successfully created, otherwise false */ bool ueCreateDatabase(); /** * @brief ueDatabaseExists * @return true if settings database exists, otherwise false */ bool ueDatabaseExists(); public: /** * @brief UeSettings * @param parent * @param printersModel */ explicit UeSettings(QObject *parent = 0, UePrintersModel* const printersModel=0); /** * @brief ~UeSettings */ ~UeSettings(); Q_INVOKABLE inline QString ueServerAddress() const { return this->m_ueServerAddress; } Q_INVOKABLE inline QString ueServerPort() const { return this->m_ueServerPort; } Q_INVOKABLE inline QString ueDatabaseName() const { return this->m_ueDatabaseName; } Q_INVOKABLE inline QString ueDatabaseUsername() const { return this->m_ueDatabaseUsername; } Q_INVOKABLE inline QString ueDatabasePassword() const { return this->m_ueDatabasePassword; } Q_INVOKABLE inline QString ueHostname() const { return this->m_ueHostname; } Q_INVOKABLE inline bool ueAutomaticStockUpdateFromFirwstWarehouse() const { return this->m_ueAutomaticStockUpdateFromFirstWarehouse; } Q_INVOKABLE inline QString ueNumerOfTopSalesProducts() const { return this->m_ueNumberOfTopSalesProductsShown; } Q_INVOKABLE inline bool ueAutomaticLogoffWorkerAtBill() const { return this->m_ueAutoLogoffWorkerAtBill; } /** * @brief ueConnectToDatabase * @return true if connetion to database successfull, otherwise false */ bool ueConnectToDatabase(); /** * @brief ueSaveSettings * @param address * @param port * @param dbName * @param dbUsername * @param dbPassword * @param hostName * @param autoStockUpdate * @param topN * @param autoLogoffWorkerAtBill * @return true if setitngs were saved in database successfully, otherwise false */ Q_INVOKABLE bool ueSaveSettings(const QString& address, const QString& port, const QString& dbName, const QString& dbUsername, const QString& dbPassword, const QString& hostName, const QString& autoStockUpdate, const QString& topN, const QString& autoLogoffWorkerAtBill/*, UeTypePrintersList* const printersList*/); /** * @brief ueLoadSettings * @return true if settings were loaded successfully, otherwise false */ Q_INVOKABLE bool ueLoadSettings(); /** * @brief ueTestConnection * @param address * @param port * @param dbName * @param dbUsername * @param dbPassword * @return true if successfully connected to database, otherwise false */ Q_INVOKABLE bool ueTestConnection(const QString& address, const QString& port, const QString& dbName, const QString& dbUsername, const QString& dbPassword); signals: /** * @brief ueSignalSettingsLoaded */ void ueSignalSettingsLoaded(); /** * @brief ueSignalSettingsSaved */ void ueSignalSettingsSaved(); /** * @brief ueSignalSettingsNotFound */ void ueSignalSettingsNotFound(); /** * @brief ueSignalTestDatabaseConnectionOk */ void ueSignalTestDatabaseConnectionOk(); /** * @brief ueSignalTestDatabaseConnectionFailed */ void ueSignalTestDatabaseConnectionFailed(); /** * @brief ueSignalSettingsDatabaseCreated */ void ueSignalSettingsDatabaseCreated(); /** * @brief ueSignalSettingsDatabaseEmpty */ void ueSignalSettingsDatabaseEmpty(); public slots: }; #endif // UESETTINGS_H
在第45行和第46行: 现在,在C++;信号未在QML侧捕捉到 我在代码> QML中检查了 Qt C++信号。这是我的UeSettings课程标题: #ifndef UESETTINGS_H #define UESETTINGS_H #include <QObject> #include <QSqlDatabase> #include <QString> #include <QStringList> #include <QDebug> #include <QSqlQuery> #include <QSqlError> #include <QDir> #include <QDateTime> #include "uedefaults.h" #include "models/ueprintersmodel.h" #include "uetypes.h" /** * @brief The UeSettings class */ class UeSettings : public QObject { Q_OBJECT private: /** * @brief m_ueServerAddress */ QString m_ueServerAddress; /** * @brief m_ueServerPort */ QString m_ueServerPort; /** * @brief m_ueDatabaseName */ QString m_ueDatabaseName; /** * @brief m_ueDatabaseUsername */ QString m_ueDatabaseUsername; /** * @brief m_ueDatabasePassword */ QString m_ueDatabasePassword; /** * @brief m_ueHostname */ QString m_ueHostname; /** * @brief m_ueNumberOfTopSalesProductsShown */ QString m_ueNumberOfTopSalesProductsShown; /** * @brief m_ueDb */ QSqlDatabase m_ueDb; /** * @brief m_ueAutomaticStockUpdateFromFirstWarehouse */ bool m_ueAutomaticStockUpdateFromFirstWarehouse; /** * @brief m_ueAutoLogoffWorkerAtBill */ bool m_ueAutoLogoffWorkerAtBill; /** * @brief m_uePrintersModel */ UePrintersModel* m_uePrintersModel; /** * @brief ueSetServerAddress * @param address */ inline void ueSetServerAddress(const QString& address) { this->m_ueServerAddress=address; } /** * @brief ueSetServerPort * @param port */ inline void ueSetServerPort(const QString& port) { this->m_ueServerPort=port; } /** * @brief ueSetDatabaseName * @param dbName */ inline void ueSetDatabaseName(const QString& dbName) { this->m_ueDatabaseName=dbName; } /** * @brief ueSetDatabaseUsername * @param dbUsername */ inline void ueSetDatabaseUsername(const QString& dbUsername) { this->m_ueDatabaseUsername=dbUsername; } /** * @brief ueSetDatabasePassword * @param dbPassword */ inline void ueSetDatabasePassword(const QString& dbPassword) { this->m_ueDatabasePassword=dbPassword; } /** * @brief ueSetNumberOfTopSalesProductsShown * @param topN */ inline void ueSetNumberOfTopSalesProductsShown(const QString& topN) { this->m_ueNumberOfTopSalesProductsShown=topN; } /** * @brief ueSetHostname * @param hostname */ inline void ueSetHostname(const QString& hostname) { this->m_ueHostname=hostname; } /** * @brief ueSetAutomaticStockUpdateFromFirstWarehouse * @param automaticStockUpdate */ inline void ueSetAutomaticStockUpdateFromFirstWarehouse(const bool& automaticStockUpdate) { this->m_ueAutomaticStockUpdateFromFirstWarehouse=automaticStockUpdate; } /** * @brief ueSetAutoLogoffWorkerAtBill * @param automaticLogoffWorkerAtBill */ inline void ueSetAutoLogoffWorkerAtBill(const bool& automaticLogoffWorkerAtBill) { this->m_ueAutoLogoffWorkerAtBill=automaticLogoffWorkerAtBill; } /** * @brief uePrintersModel * @return */ inline UePrintersModel* uePrintersModel() const { return this->m_uePrintersModel; } /** * @brief ueSetPrintersModel * @param printersModel */ inline void ueSetPrintersModel(UePrintersModel* const printersModel=0) { this->m_uePrintersModel=printersModel; } /** * @brief ueDatabase * @return */ QSqlDatabase ueDatabase() { return this->m_ueDb; } /** * @brief ueSetDatabase * @param database */ void ueSetDatabase(const QSqlDatabase& database) { this->m_ueDb=database; } /** * @brief ueCreateDatabase * @return true if settings database successfully created, otherwise false */ bool ueCreateDatabase(); /** * @brief ueDatabaseExists * @return true if settings database exists, otherwise false */ bool ueDatabaseExists(); public: /** * @brief UeSettings * @param parent * @param printersModel */ explicit UeSettings(QObject *parent = 0, UePrintersModel* const printersModel=0); /** * @brief ~UeSettings */ ~UeSettings(); Q_INVOKABLE inline QString ueServerAddress() const { return this->m_ueServerAddress; } Q_INVOKABLE inline QString ueServerPort() const { return this->m_ueServerPort; } Q_INVOKABLE inline QString ueDatabaseName() const { return this->m_ueDatabaseName; } Q_INVOKABLE inline QString ueDatabaseUsername() const { return this->m_ueDatabaseUsername; } Q_INVOKABLE inline QString ueDatabasePassword() const { return this->m_ueDatabasePassword; } Q_INVOKABLE inline QString ueHostname() const { return this->m_ueHostname; } Q_INVOKABLE inline bool ueAutomaticStockUpdateFromFirwstWarehouse() const { return this->m_ueAutomaticStockUpdateFromFirstWarehouse; } Q_INVOKABLE inline QString ueNumerOfTopSalesProducts() const { return this->m_ueNumberOfTopSalesProductsShown; } Q_INVOKABLE inline bool ueAutomaticLogoffWorkerAtBill() const { return this->m_ueAutoLogoffWorkerAtBill; } /** * @brief ueConnectToDatabase * @return true if connetion to database successfull, otherwise false */ bool ueConnectToDatabase(); /** * @brief ueSaveSettings * @param address * @param port * @param dbName * @param dbUsername * @param dbPassword * @param hostName * @param autoStockUpdate * @param topN * @param autoLogoffWorkerAtBill * @return true if setitngs were saved in database successfully, otherwise false */ Q_INVOKABLE bool ueSaveSettings(const QString& address, const QString& port, const QString& dbName, const QString& dbUsername, const QString& dbPassword, const QString& hostName, const QString& autoStockUpdate, const QString& topN, const QString& autoLogoffWorkerAtBill/*, UeTypePrintersList* const printersList*/); /** * @brief ueLoadSettings * @return true if settings were loaded successfully, otherwise false */ Q_INVOKABLE bool ueLoadSettings(); /** * @brief ueTestConnection * @param address * @param port * @param dbName * @param dbUsername * @param dbPassword * @return true if successfully connected to database, otherwise false */ Q_INVOKABLE bool ueTestConnection(const QString& address, const QString& port, const QString& dbName, const QString& dbUsername, const QString& dbPassword); signals: /** * @brief ueSignalSettingsLoaded */ void ueSignalSettingsLoaded(); /** * @brief ueSignalSettingsSaved */ void ueSignalSettingsSaved(); /** * @brief ueSignalSettingsNotFound */ void ueSignalSettingsNotFound(); /** * @brief ueSignalTestDatabaseConnectionOk */ void ueSignalTestDatabaseConnectionOk(); /** * @brief ueSignalTestDatabaseConnectionFailed */ void ueSignalTestDatabaseConnectionFailed(); /** * @brief ueSignalSettingsDatabaseCreated */ void ueSignalSettingsDatabaseCreated(); /** * @brief ueSignalSettingsDatabaseEmpty */ void ueSignalSettingsDatabaseEmpty(); public slots: }; #endif // UESETTINGS_H,c++,qt,qml,qt-signals,C++,Qt,Qml,Qt Signals,在第45行和第46行: 现在,在main.cpp中创建名为UeSettings的对象UeSettings的实例,并将其公开给QML: UeBluetoothManager* ueBtManager=new UeBluetoothManager(qApp); UePrintersModel* uePrintersModel=new UePrintersModel(qApp, ueBtManager); UeSettings* ueSettings=new UeSettings(qApp,
main.cpp
中创建名为UeSettings
的对象UeSettings
的实例,并将其公开给QML
:
UeBluetoothManager* ueBtManager=new UeBluetoothManager(qApp);
UePrintersModel* uePrintersModel=new UePrintersModel(qApp,
ueBtManager);
UeSettings* ueSettings=new UeSettings(qApp,
uePrintersModel);
engine.rootContext()->setContextProperty("ueBtManager",
ueBtManager);
engine.rootContext()->setContextProperty("uePrintersModel",
uePrintersModel);
engine.rootContext()->setContextProperty("ueSettings",
ueSettings);
我试图在一些QML
文件中捕获信号ueSignalSettingsDatabaseCreated()
和ueSignalSettingsDatabaseEmpty()
:
Connections
{
target: ueSettings
onUeSignalSettingsDatabaseCreated:
{
ueStatusText.text=qsTr("Settings Database Created.");
} // onUeSignalSettingsDatabaseCreated
} // Connections
Connections
{
target: ueSettings
onUeSignalSettingsDatabaseEmpty:
{
ueStatusText.text=qsTr("Settings Database is Empty.");
} // onUeSignalSettingsDatabaseEmpty
} // Connections
来自
C++
端的信号被触发,我已经用调试器进行了三次检查,并且没有被QML
端捕获,因为text
属性没有被更改。为什么?调试控制台根本不会触发任何警告或运行时错误(与问题相关)。您需要重新运行qMake、clean和rebuild,以便正确连接信号。如果我遇到这个问题,至少我经常遇到这种情况。您需要重新运行qMake、clean和rebuild,以便正确连接信号。如果我有这个问题,至少我经常遇到这种情况。可能是在连接
对象准备好接收QML中的信号之前发出信号。如果添加查询方法,例如
Q_INVOKABLE bool UeSettings::isUeSignalSettingsDatabaseCreated()
当您从QML端调用它时,它可能返回true
如果我是你,我会使用属性来跟踪状态。从QML,您可以使用头文件中定义的属性名称访问
Q_属性。可能是在连接
对象准备好接收QML中的信号之前发出信号。如果添加查询方法,例如
Q_INVOKABLE bool UeSettings::isUeSignalSettingsDatabaseCreated()
当您从QML端调用它时,它可能返回true
如果我是你,我会使用属性来跟踪状态。在QML中,您可以使用头文件中定义的属性名称访问Q_属性。用户是对的,在连接
对象准备在QML
端接收信号之前发出信号。我已经通过连接信号解决了这个问题
对于UeSettings::ueSlotQMLFileLoaded()
slot,我检查设置数据库的状态,而不是在构造函数中进行检查:
void UeSettings::ueSlotQMLFileLoaded(QObject* object,
const QUrl& url)
{
if(!this->ueConnectToDatabase())
{
qDebug() << Q_FUNC_INFO
<< this->ueDatabase().lastError().text();
} // if
} // ueSlotQMLFileLoaded
void UeSettings::ueSlotQMLFileLoaded(QObject*object,
const-quorl和url)
{
如果(!this->ueConnectToDatabase())
{
qDebug()用户是对的,在连接
对象准备在QML
端接收信号之前,信号已发出。我已通过连接到信号解决了此问题
对于UeSettings::ueSlotQMLFileLoaded()
slot,我检查设置数据库的状态,而不是在构造函数中进行检查:
void UeSettings::ueSlotQMLFileLoaded(QObject* object,
const QUrl& url)
{
if(!this->ueConnectToDatabase())
{
qDebug() << Q_FUNC_INFO
<< this->ueDatabase().lastError().text();
} // if
} // ueSlotQMLFileLoaded
void UeSettings::ueSlotQMLFileLoaded(QObject*object,
const-quorl和url)
{
如果(!this->ueConnectToDatabase())
{
qDebug()我的代码中没有UeSettings{id:UeSettings}
,我在main.cpp:
engine.rootContext()->setContextProperty(“UeSettings”,UeSettings)中将此对象公开给QML
为什么我要在QML
code中重新创建对象?这没有意义。我在main.cpp
中创建它,而我不需要在QML
中重新创建它。对象暴露在QML
中,就像上面提到的示例中的对象一样,而示例中的对象是有效的,我的代码却没有。我遗漏了一些微小的东西……我们怎么能看到它呢在您使用@AlexanderVX检查测试的QML中有上下文可用。您是否从类构造函数调用ueCreateDatabase()?我的代码中没有UeSettings{id:UeSettings}
,我将此对象公开给main.cpp:
engine.rootContext()->setContextProperty(“UeSettings”,UeSettings)中的QML
为什么我要在QML
code中重新创建对象?这没有意义。我在main.cpp
中创建它,而我不需要在QML
中重新创建它。对象暴露在QML
中,就像上面提到的示例中的对象一样,而示例中的对象是有效的,我的代码却没有。我遗漏了一些微小的东西……我们怎么能看到它呢在该上下文中,可以在QML中使用@AlexanderVX check进行测试。您正在调用ueCreateDatabase()吗从类构造函数?很好的提示,但是,我想要事件驱动的行为,因为我想要在创建数据库后弹出设置窗口。很好的提示,但是,我想要事件驱动的行为,因为我想要在创建数据库后弹出设置窗口。我想区别在于,在您的情况下,您启动了从构造函数发送信号Tor,不是在C++对象被完全构造之后。在例子中:1)完全创建C++对象,2)QML加载信号SytId假设不同的是,在你的情况下,你开始了从构造函数发送的信号,而不是在C++对象被完全构造之后。在例子中:1)完全创建了C++对象,2)QML加载了3个信号。