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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

2回答

5355閲覧

Qtの描画に関する質問です。

nqf27650

総合スコア115

C++

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

0グッド

0クリップ

投稿2016/12/07 13:51

下記のコードはbushButtonを押す度に、描画位置をずらして直線を描画するものです。

つまり、bushButtonを押す度に、前回描いた直線は消去して、新しい直線を描画します。

Q1) 前回描いた直線は残して、新しい直線を描画することは出来ますか?

======================
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
CTLDRAW=false;
PX=200;
PY=200;
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(draw()));

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::draw(){
ui->pushButton->setCheckable(false);
CTLDRAW=true;
update();
ui->pushButton->setCheckable(true);

}
void MainWindow::paintEvent(QPaintEvent *){
if(CTLDRAW==false){
return;
}
else{
QPainter painter(this);
//painter.setCompositionMode(QPainter::CompositionMode_Difference);
//painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
//painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
//painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
//painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
//painter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
//painter.setCompositionMode(QPainter::CompositionMode_SourceOut);
//painter.setCompositionMode(QPainter::CompositionMode_Plus);
//painter.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
painter.setPen(QPen(Qt::blue, 2, Qt::SolidLine, Qt::RoundCap));
painter.drawLine(0,0, PX, PY);//描画位置をずらして、直線の描画
if(PY>0) PY-=2;
}
}

以上、宜しくお願いします。

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

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

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

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

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

guest

回答2

0

ウインドウに直接線を引くのではなくウインドウと同サイズの画像に線を足していって画像を表示するとかもありではないかなーと思いますね

投稿2016/12/08 06:50

iwanote

総合スコア295

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

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

nqf27650

2016/12/10 03:26

毎度お世話になります。 >ウインドウに直接線を引くのではなくウインドウと同サイズの画像に線を足していって画像を表示するとかもありではないかなーと思いますね <ーー画像に線を足していって画像を作成するサンプルはありますか?
guest

0

ベストアンサー

こんにちは。

Qtを使ってはいないので外しているかもしれませんが、仕組み的にpaintEvent()はWindowsではWM_PAINT処理と思われます。その場合、WM_PAINTはウィンドウの指定領域全体を描画し直す処理ですから、過去描画した線も全て描画する必要が有ります。

他のウィンドウ・システム(GNOME等)の場合は、振る舞いが異なるかも知れませんが、Qtはマルチプラットフォーム対応ですので同じ対策が通用することを期待できると思います。

投稿2016/12/08 04:22

Chironian

総合スコア23272

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

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

nqf27650

2016/12/08 08:54

>その場合、WM_PAINTはウィンドウの指定領域全体を描画し直す処理ですから、過去描画した線も全て描画する必要が有ります。 <---OpenGLにはCanvasがあるようですから、過去に描画したものは残るようです。 まだ、OenGLの使い方は不明です。
Chironian

2016/12/08 09:24

すいません。私はOpenGLの知識がないのでOpenGLを使う方法はアドバイスできません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問