プログラム実行後にQtのメインウィンドウにボタンを追加する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
リアス

プログラム実行後にQtのメインウィンドウにボタンを追加する

#1

投稿記事 by リアス » 2年前

今回はQtdesignerとvisualstudioについて質問をします。
今回作ろうとしているのはボタンを押したら、同様の機能のボタンが追加されるプログラムです。

現在、私はQt5.3とvisualstudio2013を用いて簡単なプログラムを作ろうとしています
まだ、本当に学びたてで、理解を深めるためにサンプルプログラム程度のものを作ろうとしています。
図1のようにボタンを押したら、同様のレイアウト、同様の機能のボタンがメインウィンドウに
追加されたプログラムを作ろうとしています
http://www.fastpic.jp/images.php?file=0627381977.png

図1の左側のようにレイアウトおよびシグナルスロットの設定を行いますと、
Uiファイルから自動的に図2のようにvisualstudioに色々ヘッダファイルや、
cppファイルが作られるのですが、そこから、メインウィンドウに変化を与える
(今回はボタンの追加を行う)ためにどうすればよいかが
わかりませんでした。

とりあえず今わかっているのはボタンが押されたときに別枠でメッセージダイアログを出すプログラムは
書けたので、そのプログラムを改良して、ボタンを追加する手法があれば教えていただきたいです

以上のことよろしくお願いいたします

またメッセージダイアログを出すプログラムに関しても、「本来そこに書くべきじゃないぞ」
みたいな細かい指摘もあれば教えていただけると幸いです。

コード:

//main.cpp(自分で書き換えた場所はない)
#include "buttonproliferation.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	buttonProliferation w;
	w.show();
	return a.exec();
}

コード:

//buttonProliferation.h
#ifndef BUTTONPROLIFERATION_H
#define BUTTONPROLIFERATION_H

#include <QtWidgets/QMainWindow>
#include "ui_buttonproliferation.h"

class buttonProliferation : public QMainWindow
{
	Q_OBJECT

public:
	buttonProliferation(QWidget *parent = 0);
	~buttonProliferation();

private:
	Ui::buttonProliferationClass ui;

//自分で書いた部分(スロットの定義)
private slots:
void pushButton();
//ここまで
};

#endif // BUTTONPROLIFERATION_H

コード:

//buttonProliferation.cpp
#include "buttonproliferation.h"
#include <QMessageBox>

buttonProliferation::buttonProliferation(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
}

buttonProliferation::~buttonProliferation()
{

}

//自分で書いた部分
void buttonProliferation::pushButton()
{
	//別枠でメッセージダイアログは出せるけど・・・
	
	QMessageBox msgBox;
	msgBox.setWindowTitle("May I have your attention, please?");
	msgBox.setText(QString::fromLocal8Bit("プログラム完動おめでとう!!!"));
	msgBox.setIcon(QMessageBox::Warning);
	msgBox.setStandardButtons(QMessageBox::Ok);
	msgBox.exec();

	//ボタンを押したとき同じ機能を持つボタンをメインウィンドウに追加したい……けど、何をすればいい?
   //ご教授よろしくお願いいたします
}

あんどーなつ
記事: 171
登録日時: 2年前
連絡を取る:

Re: プログラム実行後にQtのメインウィンドウにボタンを追加する

#2

投稿記事 by あんどーなつ » 2年前

Qt Wikiを調べてみました。
以下のページが参考になるようです。

https://wiki.qt.io/How_to_Use_QPushButton

buttonProliferationクラスがウィンドウのクラスなので、buttonProliferation::pushButton()関数の中でnew QPushButton("テキスト", this);を実行すればいいようです。ボタンを表示させたままにする必要があるので、buttonProliferationのメンバとしてQPushButtonクラスのポインタを持たせる必要があります。

QPushButtonオブジェクトの廃棄についてですが、コード例ではdeleteで削除していないようでした。また、QMainWindow, QPushButtonクラスはQObjectを継承していますが、QObjectはデストラクタが呼び出されると、そのChildも全て廃棄するようなので、deleteは不要だと思います。

実際にコードを動かしているわけではないので、試してみてください。

トニ
記事: 4
登録日時: 2年前

Re: プログラム実行後にQtのメインウィンドウにボタンを追加する

#3

投稿記事 by トニ » 2年前

あんどーなつ様へ

返信ありがとうございます。
張っていただいたリンクを参考に、改良し一歩前進できました!

「ui.hogehoge」でQtDesignerが自動的に作っていたhogehogeウィジットに直接アクセスできることが分かったのは、自分にとって大きな進歩だと感じました。
(あたり前なのかも知れませんがクラスも全く理解しきれていないので)

今回やりたかったことは無事にできたわけですが、
ボタンを作るたびに、そのボタンの役割や位置をもう一度教えてあげないといけないのかな?
という疑問が生じました。

当初としては、全く同じ機能を完全コピーして、その新しいボタンの位置を決めてあげればいい。
みたいなプログラムを書ければと思っていましたが……。

やがてはボタンではなく、いろいろな機能を持たせたitem(ダイアログ?ボタンの集合体?)を
コピーしてメインウィンドウに追加することを目標としてるので
もっと勉強していかなければと思います。

現在のコードをあげなおします。

コード:

#ifndef BUTTONPROLIFERATION_H
#define BUTTONPROLIFERATION_H

#include <QtWidgets/QMainWindow>
#include "ui_buttonproliferation.h"
#include <QPushButton>

class buttonProliferation : public QMainWindow
{
	Q_OBJECT

public:
	buttonProliferation(QWidget *parent = 0);
	~buttonProliferation();

private:
	Ui::buttonProliferationClass ui;
	QPushButton *m_button; // ポインタの定義
	int count_pushButton = 0;//ボタンを押した回数

//自分で書いた部分(スロットの定義)
private slots:
void pushButton();



};

#endif // BUTTONPROLIFERATION_H

コード:

#include "buttonproliferation.h"
#include <QMessageBox>

buttonProliferation::buttonProliferation(QWidget *parent)
: QMainWindow(parent)
{
	ui.setupUi(this);
}

buttonProliferation::~buttonProliferation()
{

}

//自分で書いた部分
void buttonProliferation::pushButton()
{
	//別枠でメッセージダイアログは出せるけど

	/*QMessageBox msgBox;
	msgBox.setWindowTitle("May I have your attention, please?");
	msgBox.setText(QString::fromLocal8Bit("プログラム完動おめでとう!!!"));
	msgBox.setIcon(QMessageBox::Warning);
	msgBox.setStandardButtons(QMessageBox::Ok);
	msgBox.exec();*/

	//ボタンを押したとき同じ機能を持つボタンをメインウィンドウに追加したい……けど、何をすればいい?
	++count_pushButton;
	
	m_button = new QPushButton(ui.centralWidget);
	m_button->setObjectName("pushButton");
	m_button->setText(QApplication::translate("buttonProliferationClass", "ositane?", 0));
	ui.gridLayout->addWidget(m_button, 1 + count_pushButton, 1, 1, 1);
	connect(m_button, SIGNAL(clicked()), this, SLOT(pushButton()));
}
main.cppおよびbuttonproliferation.uiは変更なしのため省略します

実行結果→http://www.fastpic.jp/images.php?file=4284163928.png

質問の大筋は解決となりましたので、補足の書き込みがつかなくても今週いっぱいで解決扱いとします。
あんどーなつさん本当にありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る