1

プロジェクト用に qt ウィジェットを作成しました。ボタン、シグナル、スロット、スレッドのすべてが正常に機能し、出力も取得しました。

Dialog.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 スロットに接続する必要があります (コネクタは継承しますQObject) 。QObject::connect(&connector, SIGNAL(enableStart_2(QVariant)), window, SLOT(enableStart_2(QVariant)));

これは、QMLスロットにシグナルを送信する方法です emit enableStart_2(true);

アップデート

例として: あなたの

onClicked: { dialog1.startThread() }

次のようなものでなければなりません

onClicked: { startThread() }

のようなQMLファイルで定義さstartThread()れた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 に答える