2016-11-17 16 views
-2

私はここで私と同じような質問を見ましたが、まだ問題があります。QTでボタンをクリックしたときに関数を呼び出す

QTにボタンがあり、main.cppファイルで定義されている関数があります。 QTボタンを押すと、main.cppの関数を呼び出して、その関数をそのようにします。

mainwindow.cpp:

void MainWindow::on_StartMotor_clicked() 
{ 
    SendCmd(100); 
} 

main.cppに:

void SendCmd(INT Value) 
{ 
} 

しかし、私はエラーを取得する:

error: 'SendCmd' was not declared in this scope 
    SendCmd(100); 
              ^

イムQTに新しいので、私は、私は完全に理解と思ういけませんスロットとシグナルのこと。

ありがとうございます!

+1

あなたの問題は実際にqtには関係ないようですが、main.cppで定義された関数を、その関数について知らない別のクラスから呼び出すことはできません。 – user463035818

+1

あなたはQtを初めて知ったばかりでなく、 C++ ...良いC++ [book](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を読むことはあなたを助けるでしょう。 mainwindow.cppの 'on_StartMotor_clicked'の前に' void SendCmd(INT Value); 'を追加するだけで関数を宣言してください。または[ヘッダーを作成する](http://stackoverflow.com/questions/20015656/how-to-create-my-own-header-file-in-c)(これは良い) – Garf365

答えて

1

これはQTではなく、基本的なC++での問題ではありません。ですから、私の一般的な推薦は、良い本を買って、基礎から始めてこの言葉を学ぶことです。

特定の設定では、2つのcppファイルがあります。この文脈では、これらのファイルはそれぞれ別々にコンパイルされるため、変換単位と呼ばれます。この結果は、いわゆるオブジェクトファイル(.obj)です。リンカーは、あるオブジェクトファイルの機能を他のファイルに知らせるための仕事を持っています。

リンカーは、翻訳単位が他の翻訳単位の機能の宣言を知っている場合にのみ、自分の仕事を行うことができます。

通常、この宣言を含むヘッダーファイルがいくつかあります。

main.h:今

void SendCmd(INT Value); // what type is INT by the way? 

、main.cppにとmainwindow.cppの両方がこのファイルを含める必要があります。 mainwindow.cppには、この関数を呼び出す宣言があるため、コンパイラエラーは発生しません。 main.cppはコンパイルされているので、リンカは関数のリポジトリにこの関数の実装をいくつか持ち、mainwindow.cppにそのことを知らせることができます。

+0

はい私は本を読むでしょう: )しかし、私はすべての関数を "tmclfunctions.h"というヘッダファイルに移動しました。私のmainwindow.cppとmain.cppでは、次のように書いています:#include "tmclfunctions.h"そして私の関数が2回宣言されたというエラーが出ます。 – Scientized

+0

@Scientizedこれはこれを行う正しい方法であるため、ヘッダーを含むいくつかのcppファイルに関数の実装を移動していただきたいと思います。 また、ヘッダーファイルにインクルードガードを配置する必要があります。 VSでは、これのコードはファイルの先頭に '#pragma once'がありますが、コンパイラに依存しないソリューションもあります。このコメントにうまく収まらないのは基本的に3行であるため、「包含ガード」のための簡単なgoogleが役立つはずです – IceFire

関連する問題