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

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

ただいまの
回答率

90.01%

QtのQpenに関するエラー

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 282

下記のコードの

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    
#include <QtWidgets>
#include <QtCore>
#include <stdio.h>

class QGraphicsTextItemFixed : public QGraphicsTextItem
{
public:
    QRectF boundingRect();
    void forceSize(int x, int y, int width);
private:
    QRectF forcedSize;

};
QRectF QGraphicsTextItemFixed::boundingRect()
{
    this->forcedSize = QRectF(0, 0, 10, 20);
    return forcedSize;
}
void QGraphicsTextItemFixed::forceSize(int x, int y, int width)
{
    forcedSize.setCoords(0, 0, width, 20);
    setPos(x, y);
}
class NoteEditor : public QGraphicsView
{
    QString select_tool = "Select";
    int new_measure_count = 0;
    int measure_count = 0;
    int start_mouse_press_x = 0;
    int start_mouse_press_y = 0;
    int end_mouse_press_x = 0;
    int end_mouse_press_y = 0;
    int mouse_start_button = 0;
    void initUI();
    void drawMeasure(int measure_off_no, int measure_count);
};

void NoteEditor::initUI()
{
    QGraphicsScene *scene = new QGraphicsScene(this);
    this->setScene(scene);
    QGraphicsRectItem *current_draw = new QGraphicsRectItem();
    int quantize = 4;
    int grid = 4;
    this->select_tool = "Select";
    this->drawMeasure(0, 50);
}
void NoteEditor::drawMeasure(int measure_off_no, int measure_count = 1)
{
    new_measure_count += measure_count;
    QBrush* brush = new QBrush(QColor(90, 90, 90));
    QPen* pen = new QPen(QColor(45, 45, 45));
    pen->setWidth(2);

    QBrush* brush2 = (QColor(60, 60, 60));
    QPen* pen2 = new QPen(QColor(75, 75, 75));
    pen2->setWidth(2);

    QBrush *brush3 = new QBrush(QColor(120, 120, 120));
    QPen *pen3 = new QPen(QColor(105, 105, 105));
    pen3->setWidth(2);

    int measure_x_draw = measure_count * 480;
    int offset = measure_off_no * 480;

    for (int i = 0; i <= 7; i++) {
        this->scene()->addRect(offset, 0 + (240 * i), measure_x_draw, 20, pen, brush);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

こんにちは。

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

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 13:25

    ありがとうございます!!!コンパイルエラーはすべて解決しました。

    MainWindowの中にQGraphicsViewをshow()したいのですが、どうしてもMainWindowとQGraphicsViewの二つのウィンドウが出てきてしまいます

    キャンセル

  • 2019/05/16 13:39

    > MainWindowの中にQGraphicsViewをshow()したい

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

    キャンセル

  • 2019/05/16 13:58

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

    キャンセル

0

documentation読んでください。

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

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

つまり、

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

ではなく、

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

のように生成すべき。

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

QPen& toPenInstanceWithoutNew( QPen* p ){
      QPen r;
      r.setColor( p.color() );
return p;
}

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

this->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 11: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
    というエラーが出ました。

    キャンセル

  • 2019/05/16 11:45

    VersionはQt5.11です

    キャンセル

  • 2019/05/16 12:44

    追記します

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる