2011-07-15 11 views
2

私はQt GUIプログラミングの初心者です.GUI開発が進む限り、.NET/Winformsのバックグラウンドから来ています。私はQt Creator IDEを使用しています。Qtでのイベント処理

私は、次のような何かを行うにはQtでボタン押下イベントを処理するにはどうすればよい

:私は私のラインエディットテキストボックスときのすべてに値を移入う設定ファイルを参照する方法をまた

if (button.clicked = true) 
{ 
    startProgram(); 
} 

を、開いた?私はこれをC++でプログラミングしています。

EDIT:私は誰かが書いたGUIを作成するコンソールアプリケーションを利用しています。ボタンのクリックイベントからそこの関数の1つにアクセスしたいと思います。しかし、元のアプリケーションの機能を、シグナルとスロットを使用しようとしたときに作成したGUIの範囲に収める方法を理解できません。

+1

は、私はあなたがQML、またはUIデザイナを使用して –

+0

あなたが計画していますhttp://doc.qt.nokia.com/latest/tutorials.htmlでQtのチュートリアルに従ってください示唆しますか?これは大きな違いになります。 – kmdent

+0

@kmdent - 私はUIデザイナーを使用しています。 –

答えて

1

コンソールアプリケーションで定義された関数にアクセスするには、これらの関数を宣言するヘッダー(.h/.hpp)を含め、その実装をリンクする必要があります。私は実装のソースコード(.cpp)を持っています。コンパイルするソースに追加する必要があります(最終実行ファイルにリンクされるオブジェクトファイル(.o)でコンパイルされます)。コンソールアプリケーションがライブラリ(.lib、.a)で定義された一連の関数のフロントエンドである場合は、このライブラリをリンクする必要があります。

その後、Qtの信号/スロット機構を使用して、他の回答に記載されているように、実行する機能を呼び出すスロットに「クリックされた」信号を接続することができます。

6

説明するには少し時間がかかりますが、ボタンとスロットの間の信号を機能で接続します。あなたは、コンパイル済みの別の実行中のプログラム内の関数を呼び出すようにしようとしている?あなたは本当にコード

編集を作成しようとする前にsignals and slotsを読んで理解する必要が

connect(button, SIGNAL(triggered()), this, SLOT(doSomething())); 


QtシグナルをC/Unixシグナルと混同していますか? Qtアプリ内から別のアプリを起動し、そのPIDを取得してから 'c'シグナルを送ることができます。

もしあなたがアプリケーションのソースを持っていれば、あなたのQtアプリにそのコードを組み込み、Qtスロットハンドラでそれらをラップするだけで関数を呼び出すことができます。

+0

私はこのアプローチを試みましたが、私はボタンをクリックしたときにトリガーしたい機能にアクセスできないようです。私は私の元の質問に詳細を追加しました。 –

15

単純な例は、次のようなものです。あなたはProgramStarterのようなクラスを持っていると言う:

#include <QObject> 

class ProgramStarter : public QObject { 

    Q_OBJECT 

public slots: 

    void startProgram() { 
     //Do stuff 
    } 

}; 

とProgramStarterが使用されている。このような何か:

#include <QtGui/QApplication> 
#include <QPushButton> 
#include <QObject> 

#include "programstarter.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QPushButton *testButton = new QPushButton("Push me"); 
    testButton->resize(100, 40); 
    testButton->show(); 

    ProgramStarter *program = new ProgramStarter; 

    QObject::connect(testButton, SIGNAL(clicked()), program, SLOT(startProgram())); 

    return app.exec(); 
} 

Qtは、オブジェクト間の通信にシグナルとスロットを使用しています。コアアイデアは、イベントが発生したときに信号が発信され、これらの信号をスロットに接続できることです。この場合、ボタンはボタンが押され、clicked()信号がstartProgram()スロットに接続されたときにclicked()信号を出します。ボタンを押すと、startProgram()が呼び出されます。

Qtには、とりわけ、信号とスロットの使用を可能にするメタオブジェクトシステムがあります。これは、ProgramStarterがQObjectを継承する理由とQ_OBJECTマクロがヘッダーにある理由です。 http://doc.qt.io/qt-5/signalsandslots.html

+0

ありがとう、私のGUIから必要な機能にアクセスできないようです。私のオリジナルの質問に追加した追加の詳細をご覧ください。 –

0

ボタンをデザイナーで作成した場合、親ウィジェットクラスのon_myButton_clicked()スロットを使用することができますWinFormsと同じように、

1

あなたの問題は本当にQtやGUIプログラミングではなく、むしろ一般的な設計上の問題と思われます。他の人は、ボタンが押されたときに通知を受ける方法を教えてくれました。あなたが呼びたいコードに通知するのはあなた次第です。いくつかの可能性:

  • 関数を呼び出す必要がある場合は、適切なヘッダーファイルをインクルードして呼び出します。
  • メソッドを呼び出すオブジェクトがある場合、通知を受け取るクラスへのオブジェクトへの参照を提供する必要があります。
  • コンソールアプリケーションが別のプログラムの場合は、QProcessを使用して起動して通信することができます。
1

あなたの問題は、コンソールアプリの機能をスロットとは定義されていないので呼び出せないことです。それで、あなたがそれをやる方法はここにあります。

のは、あなたがこのようになりますコンソールアプリケーションのクラスを持っていると仮定しましょう:

class ConsoleApp 
{ 
public: 
    void run() 
    { 
     // Code which you want to trigger by a button in your UI. 
    } 
} 

その後、我々はそれゆえ、QObjectをクラスから継承するとQtベースのラッパークラスを実装し、信号を送信および受信することができます。このクラスは、ConsoleAppクラスに実行を委譲するカスタムスロットを提供するだけです。

class ConsoleAppWrapper : public QObject 
{ 
    Q_OBJECT 

public slots: 
    void startProgram() 
    { 
     m_consoleApp.run(); 
    } 

private: 
    ConsoleApp m_consoleApp; 
} 

[OK]を押すと、 'run()'メソッドの呼び出しがトリガーされます。

int main(int argc, const char** argv) 
{ 
    QApplication app(argc, argv); 

    // Define wrapper for console app. 
    ConsoleAppWrapper wrapper; 

    // Define button and connect its 'clicked()' signal 
    // to the wrapper's 'startProgram()' slot. 
    QPushButton startProgramButton("Start Program"); 
    connect(&startProgramButton, SIGNAL(clicked()), &wrapper, SLOT(startProgram())); 

    // Show the button. 
    startProgramButton.setVisible(true); 

    // Start Qt's event loop. 
    app.exec(); 
} 

このボタンを押すと、ConsoleApp :: run()メソッドが呼び出されます。

この例はQt Designerベースではありませんが、この例は、信号とスロットがQtでどのように機能するかを理解するのに役立ちます。

乾杯、 ジョニー