1

Qt と C++ は初めてです。各正方形がオブジェクトであるチェッカー/チェス盤を作成しようとしています。私が理解しようとしているのは、各正方形のオブジェクトを、宣言しているボード オブジェクトの一部にして、それを画面に表示する方法です。メイン クラスで MyWidget.show() を使用して、画面にウィジェットを表示できます。しかし、私は Board.show() のようなことをして、そのクラスのメンバーである (高さ、幅、および色を持つ) 正方形のオブジェクトをすべて表示したいと考えています。私が試したコードでは何も表示されませんでしたが、ボード クラスにない正方形を表示することはできました。

main.cpp

#include <qtgui>
#include "square.h"
#include "board.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    //Square square;
    //square.show();
    Board board;
    board.show();
    return app.exec();
}

board.h および board.cpp

#ifndef BOARD_H
#define BOARD_H

#include <QWidget>

class Board : public QWidget
{
public:
    Board();
};

#endif // BOARD_H

#include "board.h"
#include "square.h"

Board::Board()
{
    Square square;
    //square.show();
}

square.h および square.cpp*ストロング テキスト*

#ifndef SQUARE_H
#define SQUARE_H

#include <QWidget>

class Square : public QWidget
{
public:
    Square();

protected:
    void paintEvent(QPaintEvent *);
};

#endif // SQUARE_H

#include "square.h"
#include <QtGui>

Square::Square()
{
    QPalette palette(Square::palette());
    palette.setColor(backgroundRole(), Qt::white);
    setPalette(palette);
}

void Square::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QBrush("#c56c00"));
    painter.drawRect(10, 15, 90, 60);
}
4

1 に答える 1

2

YourSquareは自動変数として作成されます (つまり、その有効期間は のコンストラクターのスコープですBoard)。 show()イベント ループがウィジェットを処理できる限り、ウィジェットを表示しますが、ここではそうではありません (squareイベント ループの前に削除されます)。

また、から派生したすべてのクラスにマクロを追加する必要がありQ_OBJECTQObjectます。Boardは から派生しQWidget、 は から派生しQObjectます。

だから、あなたのクラスを変更してくださいBoard

class Square;
class Board : public QWidget
{
Q_OBJECT
public:
    Board();
private:
    Square* square;
};

コンストラクター:

Board::Board()
{
    square = new Square();
    square->show();
}

そしてデストラクタ:

Board::~ Board()
{
    delete square;
}

注:私にとって、Squareクラスを持つことは無意味です。の でグリッドをペイントできます。これpaintEventによりBoard、高速になり、メモリ消費量が減り、保守が容易になります。

編集:ここにもっと良い方法があります:

void Board::paintEvent(QPaintEvent* pe)
{
    // Initialization
    unsigned int numCellX = 8, numCellY = 8;
    QRect wRect = rect();
    unsigned int cellSizeX = wRect.width() / numCellX;
    unsigned int cellSizeY = wRect.height() / numCellY;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // Draw the background. The whole widget is drawed.
    painter.setBrush(QColor(0,0,0)); //black
    painter.drawRect(wRect);

    // Draw the cells which are of the other color
    // Note: the grid may not fit in the whole rect, because the size of the widget
    // should be a multiple of the size of the cells. If not, a black line at the right
    // and at the bottom may appear.
    painter.setBrush(QColor(255,255,255)); //white
    for(unsigned int j = 0; j < numCellY; j++)
        for(unsigned int i = j % 2; i < numCellX; i+=2)
            painter.drawRect(i * cellSizeX, j * cellSizeY, cellSizeX, cellSizeY);
}
于 2013-04-05T08:39:47.767 に答える