1

我为我的项目创建了一个 qt 小部件。按钮,信号和插槽,线程一切正常,我也得到了输出。

对话.h

public slots:

    void startThread();
    void stopThread();
};

#endif // DIALOG_H

对话框.cpp

void  Dialog:: startThread(){

    if(!startThreadflag){

    this->ui->Start_2->setEnabled(false);
    this->ui-> Stop_2->setEnabled(true);

    startThreadflag = true;
    stopThreadflag = false;

    }
}

void Dialog:: stopThread(){

    if(!stopThreadflag){
            cout << "Closing threads"<< endl;

        this->ui->Start_2->setEnabled(true);
        this->ui->Stop_2->setEnabled(false);

        stopThreadflag= true;
        startThreadflag = false;
    }
}

void Dialog::on_Close_clicked()
{
    cout<<"close_clicked"<<endl;

    this->close();
}

为了创建仪表板的目的,我在 qml 中开发了相同的 ui,当我按下按钮信号和插槽连接时,信号和插槽所有连接的东西。但我不知道如何连接标签按钮,设置启用。

那是qt小部件代码。在那个 dialog.cpp 和 qml 下面

对话框.cpp

void Dialog::startThread()
{
    cout<<"Start Clicked"<<endl;

    emit startbuttonclicked();
}

void Dialog::stopThread()
{
    cout<<"Stop Clicked"<<endl;

    emit stopbuttonclicked();
}

dashboard.qml :(就像所有按钮一样)

               Item {
              Dialog { 
                 id: dialog1;
                  }
                 Button {
                     x:220
                     y:295
                     text: "Start"
                     onClicked: { dialog1.startThread() }
                     }
                 }
4

3 回答 3

0

在您的 QML 文件中创建一个函数以启用/禁用您的标签

function enableStart_2(enable)
{
    Start_2.enabled = enable;
}

然后您需要将您的 Qt 信号连接到 QML 插槽,例如(连接器继承QObjectQObject::connect(&connector, SIGNAL(enableStart_2(QVariant)), window, SLOT(enableStart_2(QVariant)));

这就是您将信号发送到 QML 插槽的方式 emit enableStart_2(true);

更新

例如:您的

onClicked: { dialog1.startThread() }

一定是这样的

onClicked: { startThread() }

startThread()在您的 QML 文件中定义的 QML 信号,例如signal startThread().

您需要将 QML 信号连接到 C++ 代码中的插槽:

QObject::connect(window, SIGNAL(startThread()), &foo, SLOT(onStartThread()));

现在您需要在 Foo 类中定义一个插槽:

class Foo : public QObject
{
    Q_OBJECT
public slots:
    void onStartThread(void);
};

在函数的定义中,onStartThread你开始你的线程。

于 2016-08-19T10:30:58.313 回答
0

我已经找到了解决方案。使用他可以启用特定按钮。

 Connections {
               target:dialogObj
               onStart_2EnabledChanged: {
               startBtn.enabled = state
              }
                onStop_2EnabledChanged: {
                stopBtn.enabled = state
              }
         }
于 2016-08-22T12:15:51.643 回答
0

指定函数返回的变量类型 main() 必须返回一个整数

在实例化 QApplication 之前没有缩放。

     QGuiApplication app(argc, argv);

    QFontDatabase::addApplicationFont(":/fonts/DejaVuSans.ttf");
    app.setFont(QFont("DejaVu Sans"));
// Now I am using Dialog like context property in qml
// qmlRegisterType<Dialog>("CustomExtensions",1,0,"Dialog");
Dialog dlg;
QQmlApplicationEngine engine;

// Now in qml we can access to dlg by "dialogObj" name

engine.rootContext()->setContextProperty("dialogObj", &dlg);
engine.load(QUrl(QStringLiteral("qrc:/qml/dashboard.qml")));

//QQmlApplicationEngine engine(QUrl("qrc:/qml/dashboard.qml"));       ``

使用它,您可以使用 qml 访问 Qt 信号和插槽

于 2016-11-08T12:36:03.290 回答