質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2724閲覧

vs2015 で QFileDialog::getOpenFileName(this) でエラーが出る

hama99

総合スコア11

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/05/29 03:08

VisualStudio 2015 にQt Addin を入れてGUIアプリを作成しています。

自動生成されたテンプレートを元に、Generated Files内のヘッダファイルに

private slots:
void file_open();

public:
QObject::connect(action_Open, SIGNAL(triggered()), QtGui1Class, SLOT(file_open()));

を記載し、ソースファイルで void file_open() の中身として
タイトルの

QString file_name = QFileDialog::getOpenFileName(this);

を書いたのですが、

C2355 'this' : 静的でないメンバー関数の内部または静的でないデータ メンバー初期化子においてのみ参照できます

というエラーが出てしまいます。

Qtのリファレンスを見ると、エラーに該当する部分の引数は QWidget * parent = 0となっており、何か帰属させるwidgetを指定するようですが、どうしたらいいか分かりません。

どうしたら良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

QFileDialog::getOpenFileNameの第1引数はQWidgt*です。
掲載されたコードを見る限りQObject*を渡しているのではないでしょうか?

QtプログラムですのでQMainWindowを継承したクラスを作っているはずです、そのインスタンスを渡せばOKです。
そもそもQFileDialog::getOpenFileNameの第1引数は必須ではありません、第1引数に与えられたQWidgt*の中心にダイアログを表示するというだけです。
特にダイアログの位置を気にしなければ、QFileDialog::getOpenFileNameは引数なしで良いのではないでしょうか?

投稿2017/05/29 05:22

編集2017/05/29 05:22
pashango2

総合スコア930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hama99

2017/05/29 08:50

回答ありがとうございます。 確かに引数は省略しても大丈夫でした。
guest

0

ベストアンサー

こんにちは。

file_open()関数があたかもstatic関数であるかのようなエラー・メッセージですね。void file_open()の定義を間違っているのでは?
ありがちなミスは

C++

1void file_open() 2{ 3 QString file_name = QFileDialog::getOpenFileName(this); 4}

と書いてしまうことですね。
これでは、元クラスのメンバ関数ではなく「グローバル関数」の定義になってしまいます。


できればこのような時はfile_open()を含むクラスやfile_open()のソースも提示して頂いた方が回答しやすいです。
もし、そのソースが大きい場合は同じエラーが出る程度までシュリンクすることが質問する時の良い習慣でもあります。

経験的にはその方が解決が速いです。質問するまでもなく、その作業中に解決することが大半ですから。

投稿2017/05/29 03:46

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hama99

2017/05/29 08:49

回答ありがとうございます。 ご指摘の通り :: が抜けていました…。 おかげでエラーは消えたのですが、その後もダイアログは表示されず、色々やっていました。 connect関数をコンストラクタに記載したら動くようになりました。 質問内容から少し離れましたが、最終的に解決しましたので、ご報告します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問