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

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

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

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

C++

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

Q&A

2回答

317閲覧

QtのQpenに関するエラー

kemomimi_sabal

総合スコア12

Qt

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

C++

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

0グッド

0クリップ

投稿2019/05/15 16:05

下記のコードの

for (int i = 0; i <= 7; i++) { this->scene()->addRect(offset, 0 + (240 * i), measure_x_draw, 20, pen, brush); }

の部分でこのようなエラーが出ました。どうすればいいのでしょうか

C2664 'QGraphicsRectItem *QGraphicsScene::addRect(qreal,qreal,qreal,qreal,const QPen &,const QBrush &)': 引数 5 を 'QPen *' から 'const QPen &' へ変換できません。 (ソース ファイルをコンパイルしています SiVo.cpp) QtGuiApplication1 C:\Users\yuu\source\repos\QtGuiApplication1\QtGuiApplication1\Editor.cpp 67

C++

1#include <QtWidgets> 2#include <QtCore> 3#include <stdio.h> 4 5class QGraphicsTextItemFixed : public QGraphicsTextItem 6{ 7public: 8 QRectF boundingRect(); 9 void forceSize(int x, int y, int width); 10private: 11 QRectF forcedSize; 12 13}; 14QRectF QGraphicsTextItemFixed::boundingRect() 15{ 16 this->forcedSize = QRectF(0, 0, 10, 20); 17 return forcedSize; 18} 19void QGraphicsTextItemFixed::forceSize(int x, int y, int width) 20{ 21 forcedSize.setCoords(0, 0, width, 20); 22 setPos(x, y); 23} 24class NoteEditor : public QGraphicsView 25{ 26 QString select_tool = "Select"; 27 int new_measure_count = 0; 28 int measure_count = 0; 29 int start_mouse_press_x = 0; 30 int start_mouse_press_y = 0; 31 int end_mouse_press_x = 0; 32 int end_mouse_press_y = 0; 33 int mouse_start_button = 0; 34 void initUI(); 35 void drawMeasure(int measure_off_no, int measure_count); 36}; 37 38void NoteEditor::initUI() 39{ 40 QGraphicsScene *scene = new QGraphicsScene(this); 41 this->setScene(scene); 42 QGraphicsRectItem *current_draw = new QGraphicsRectItem(); 43 int quantize = 4; 44 int grid = 4; 45 this->select_tool = "Select"; 46 this->drawMeasure(0, 50); 47} 48void NoteEditor::drawMeasure(int measure_off_no, int measure_count = 1) 49{ 50 new_measure_count += measure_count; 51 QBrush* brush = new QBrush(QColor(90, 90, 90)); 52 QPen* pen = new QPen(QColor(45, 45, 45)); 53 pen->setWidth(2); 54 55 QBrush* brush2 = (QColor(60, 60, 60)); 56 QPen* pen2 = new QPen(QColor(75, 75, 75)); 57 pen2->setWidth(2); 58 59 QBrush *brush3 = new QBrush(QColor(120, 120, 120)); 60 QPen *pen3 = new QPen(QColor(105, 105, 105)); 61 pen3->setWidth(2); 62 63 int measure_x_draw = measure_count * 480; 64 int offset = measure_off_no * 480; 65 66 for (int i = 0; i <= 7; i++) { 67 this->scene()->addRect(offset, 0 + (240 * i), measure_x_draw, 20, pen, brush); 68 } 69} 70

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

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

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

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

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

guest

回答2

0

こんにちは。

ポインタではなく参照で渡せばよいです。前置単項演算子の方の'*'はポインタを参照へ変換します。
ですので、下記でいけるだろうと思います。

this->scene()->addRect(offset, 0 + (240 * i), measure_x_draw, 20, *pen, brush);

QGraphicsTextItemFixed::forceSizeの多重定義エラーの件は、エラーメッセージの通り、Editor.objとSiVo.objの両方で定義されているのだと思います。Editor.cpp、SiVo.cppのソースを確認し、不要な方を削除しましょう。

投稿2019/05/16 03:47

Chironian

総合スコア23272

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

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

kemomimi_sabal

2019/05/16 04:25

ありがとうございます!!!コンパイルエラーはすべて解決しました。 MainWindowの中にQGraphicsViewをshow()したいのですが、どうしてもMainWindowとQGraphicsViewの二つのウィンドウが出てきてしまいます
Chironian

2019/05/16 04:39

> MainWindowの中にQGraphicsViewをshow()したい の意味が分かりません。2つ表示したら2つ表示されるのは当然では? また、主旨の異なる質問を1つのQAで継続するのは好ましくないです。 別途質問をたてて、もう少し詳しい状況を説明した方が良いですよ。
kemomimi_sabal

2019/05/16 04:58

ありがとうございます!そうします。、
guest

0

documentation読んでください。

メッセージにある通り、const QPen& が要求されているのに QPen* が渡されていることが原因。

だからnew/deleteでやるような生成方法ではなく、もう一方のほうで生成すべきかと。

つまり、

C++

1 QPen* pen2 = new QPen(QColor(75, 75, 75)); 2 pen2->setWidth(2);

ではなく、

C++

1 QPen pen2(QColor(75, 75, 75)); 2 pen2.setWidth(2);

のように生成すべき。

どうしてもポインタで生成して処理したいなら

C++

1QPen& toPenInstanceWithoutNew( QPen* p ){ 2 QPen r; 3 r.setColor( p.color() ); 4return p; 5}

とかみたいに変換するような関数を用意してそれで

C++

1this->scene()->addRect(offset, 0 + (240 * i), measure_x_draw, 20, toPenInstanceWithoutNew(p), brush);

のようにするか。

ただし、最後のやつは試していないのでまったくわかりません。(もしかしたらミスがあるかも?)

また、Qtはバージョンによって極端に違う時があります。

なのでバージョンは明記しておいたほうがいいですよ。


[追記1]

エラー LNK2005 "public: void __cdecl QGraphicsTextItemFixed::forceSize(int,int,int)" (?forceSize@QGraphicsTextItemFixed@@QEAAXHHH@Z) は既に Editor.obj で定義されています。 QtGuiApplication1 C:\Users\yuu\source\repos\QtGuiApplication1\QtGuiApplication1\SiVo.obj 1

というリンケージエラーが出たということですよね?

正直、これだけではわかりません。

そもそも Editor.obj というのがわかりません。

普通に読めば、Editor.obj で定義されている関数やメンバ関数、クラス定義が再度定義されている
的な__重複系エラー__ (さすがにそういう名称はないですが... 多重定義だとオーバーなんちゃらとかとかぶってわかりにくいので...) かと。

投稿2019/05/16 01:54

編集2019/05/16 03:49
BeatStar

総合スコア4958

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

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

kemomimi_sabal

2019/05/16 02:44

ありがとうございます!!QPenに関しては解決しましたが、Linkerのエラーで エラー LNK2005 "public: void __cdecl QGraphicsTextItemFixed::forceSize(int,int,int)" (?forceSize@QGraphicsTextItemFixed@@QEAAXHHH@Z) は既に Editor.obj で定義されています。 QtGuiApplication1 C:\Users\yuu\source\repos\QtGuiApplication1\QtGuiApplication1\SiVo.obj 1 というエラーが出ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問