質問内容
C++もQTも共に初心者の者です。
下記コードではウィンドウ中にひとつだけボタンがあり
そのボタンを押すと標準出力にpushと表示させるプログラムです。
その中のwindow.uiはUICでコンパイルすると
ボタンクラスの親ウィジェットであるウィンドウクラス(Ui::Window1)
を含むui_window.h生成します。
私はwindow.uiを作成するときQT DesignerでUi::Window1にmy_slot()を追加し
ボタンクラスのclicked()シグナルとひも付けました。
なのでボタンが押されたらUi::Window1::my_slot()が実行されると認識しております。
しかしそのmy_slot()メソッドはUi::Window1のメソッドです。
mainwindow.cpp内のWinクラス(最高位のウィンドウ)の
文字列"push"を標準出力する処理が書かれたmy_slot()メソッドではありません。
またWinクラスが継承しているクラスはQMainWindowクラスであり
Ui::Window1はメンバとして所持しているだけなので
継承元のメソッドをオーバーライドしているようにも思えません。
なぜボタンが押された時紐付けられていないはずの
Win::my_slot()が呼び出されるのでしょうか。
どうかご回答よろしくお願いいたします。
実行時の画像
コードやフォルダの構造
- フォルダの構造
terminal
1. 2├── CMakeLists.txt <- CMakeスクリプト 3├── bin 4│ └── *a.out(実行ファイル本体)* 5├── build 6│ └── *ビルドやコンパイルで生成されるファイル郡* 7├── main.cpp <- main関数を含むクラス 8├── mainwindow.cpp <- Winクラスの実装 9├── mainwindow.hpp <- Winクラスのヘッダ 10└── window.ui <- ウィンドウやボタンの詳細を記したファイル 11 12
- CMake用スクリプト CMakeLists.txt
Cmake
1################ 2# 変数定義 3################ 4 5#生成する実行ファイル名 6set ( OUT_PUT_FILE_NAME a.out) 7 8#インクルードディレクトリ 9set( INCLUDE_DIRS 10 /usr/include 11 ${CMAKE_SOURCE_DIR}/include 12) 13 14#リンクディレクトリ 15set( LINK_DIRS 16 /usr/lib/x86_64-linux-gnu 17 ${CMAKE_SOURCE_DIR}/lib 18) 19 20#リンクライブラリファイル名 21set( LINK_NAME 22 23) 24 25#このディレクトリの実装ファイル 26file( GLOB CPP_FILES 27 ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp 28 ${CMAKE_CURRENT_SOURCE_DIR}/*.ui 29 ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc 30) 31 32#コンパイラ指定 33set(CMAKE_C_COMPILER ${clang-6.0} ) 34set(CMAKE_CXX_COMPILER ${clang++-6.0}) 35 36############ 37# 実行 38############ 39 40#cmakeのバージョン指定 41cmake_minimum_required(VERSION 3.8.2) 42 43#プロジェクト名と言語指定 44project(QT5_wxsample CXX) 45 46#c++17使用 47set(CMAKE_CXX_STANDARD, 17) 48 49# オプション指定する 50set(CMAKE_CXX_FLAGS "-Wall") 51 52#デバッグ版とリリース版の設定 53set(CMAKE_CXX_FLAGS_DEBUG "-g3 -O0 -pg") 54set(CMAKE_CXX_FLAGS_RELEASE "-O2 -s -DNDEBUG -march=native") 55set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g3 -Og -pg") 56set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -s -DNDEBUG -march=native") 57 58##################### 59# QT5使用のための項目 60##################### 61set(CMAKE_INCLUDE_CURRENT_DIR ON) 62set(CMAKE_AUTOMOC ON) 63set(CMAKE_AUTOUIC ON) 64set(CMAKE_AUTORCC ON) 65find_package(Qt5 REQUIRED COMPONENTS Widgets) 66 67#インクルードディレクトリ指定 68include_directories(${INCLUDE_DIRS}) 69 70#リンクディレクトリ指定 71link_directories(${LINK_DIRS}) 72 73#実行ファイルの生成先 74set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) 75 76#実行ファイル作成 77add_executable(${OUT_PUT_FILE_NAME} ${CPP_FILES}) 78 79#ライブラリとのリンク 80target_link_libraries(${OUT_PUT_FILE_NAME} ${LINK_NAME}) 81target_link_libraries(${OUT_PUT_FILE_NAME} Qt5::Widgets)
- main関数を含む main.cpp
c++
1#include "mainwindow.hpp" 2#include <QApplication> 3 4int main(int argc, char *argv[]) 5{ 6 QApplication a(argc, argv); 7 Win w; 8 w.show(); 9 10 return a.exec(); 11}
- Winクラス(自作ウィンドウ)のヘッダーを記載したファイル mainwindow.hpp
c++
1#pragma once 2 3#include <QMainWindow> 4 5namespace Ui { 6 class Window1; 7} 8 9class Win : public QMainWindow{ 10 Q_OBJECT 11 12 public: 13 explicit Win(QWidget *parent = 0); 14 ~Win(); 15 16 private slots: 17 void my_slot(); 18 19 private: 20 Ui::Window1 *ui; 21}; 22
- winクラスの実装を記載したファイル mainwindow.cpp
c++
1#include "mainwindow.hpp" 2#include "ui_window.h" 3#include <iostream> 4 5Win::Win(QWidget *parent) : 6 QMainWindow(parent), 7 ui(new Ui::Window1) 8{ 9 ui->setupUi(this); 10} 11 12Win::~Win() 13{ 14 delete ui; 15} 16 17void Win::my_slot()// <ーなぜWinクラスのmy_slot()が呼び出されるのかわからない。 18{ 19 std::cout << "push" << std::endl; 20}
- uiファイル(ビルド時にui_window.hに変換される)ファイル window.ui
ui
1<?xml version="1.0" encoding="UTF-8"?> 2<ui version="4.0"> 3 <class>Window1</class> 4 <widget class="QMainWindow" name="Window1"> 5 <property name="geometry"> 6 <rect> 7 <x>0</x> 8 <y>0</y> 9 <width>482</width> 10 <height>323</height> 11 </rect> 12 </property> 13 <property name="windowTitle"> 14 <string>Hello, World!</string> 15 </property> 16 <widget class="QWidget" name="centralWidget"> 17 <layout class="QGridLayout" name="gridLayout"> 18 <item row="0" column="0"> 19 <widget class="QPushButton" name="pushButton"> 20 <property name="text"> 21 <string>PushButton</string> 22 </property> 23 </widget> 24 </item> 25 </layout> 26 </widget> 27 <widget class="QMenuBar" name="menuBar"> 28 <property name="geometry"> 29 <rect> 30 <x>0</x> 31 <y>0</y> 32 <width>482</width> 33 <height>27</height> 34 </rect> 35 </property> 36 <widget class="QMenu" name="menuFile"> 37 <property name="title"> 38 <string>&File</string> 39 </property> 40 <addaction name="actionExit"/> 41 </widget> 42 <addaction name="menuFile"/> 43 </widget> 44 <widget class="QStatusBar" name="statusBar"/> 45 <action name="actionExit"> 46 <property name="text"> 47 <string>E&xit</string> 48 </property> 49 </action> 50 </widget> 51 <layoutdefault spacing="6" margin="11"/> 52 <tabstops> 53 <tabstop>pushButton</tabstop> 54 </tabstops> 55 <resources/> 56 <connections> 57 <connection> 58 <sender>pushButton</sender> 59 <signal>clicked()</signal> 60 <receiver>Window1</receiver> 61 <slot>my_slot()</slot> 62 <hints> 63 <hint type="sourcelabel"> 64 <x>84</x> 65 <y>150</y> 66 </hint> 67 <hint type="destinationlabel"> 68 <x>93</x> 69 <y>55</y> 70 </hint> 71 </hints> 72 </connection> 73 </connections> 74 <slots> 75 <slot>my_slot()</slot> 76 </slots> 77</ui>
開発環境の備考
ツールの種類 | ツールの名前 | バージョン |
---|---|---|
コンパイラ | clang++ | 6.0.0 |
コンパイルツール | GNU Make | 4.1 |
コンパイルツール | CMake | 3.17.2 |
GUIツール | QT | 5.6.2 |
OS | Linux Mint | 18.3 |
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/26 07:27
2020/05/26 09:16 編集
退会済みユーザー
2020/05/26 17:23 編集
2020/05/27 05:56
退会済みユーザー
2020/05/27 17:43