Qt: две кнопки в одной, игральная кость в другом окне

В Qt я программирую «игру», которая показывает вам выпавшие кости со случайными числами. Это на самом деле очень просто, но для меня как для новичка это довольно сложная задача.

До сих пор я реализовал следующие виджеты, функции и так далее:

1) Кнопка, которая относится к слоту, который выбирает случайное значение от 1 до 6

2) Кнопка, которая закрывает приложение

3) нарисованная игральная кость (painter.drawRoundedRect & painter.drawEllipse для всех 6 возможностей).

Я хочу, чтобы кнопка 1) и кнопка 2) отображались в одном окне, а кости 3) в другом окне. Однако сейчас две кнопки находятся в двух окнах, и игральные кости (правильно) отображаются в отдельном окне (как и должно быть).

Если я создаю новый QGridLayout и добавляю к нему виджет кнопки 1), он внезапно появляется в окне игры в кости! Я совершенно запутался, как это на самом деле работает.

dicewidget.cpp:

DiceWidget::DiceWidget(QWidget *parent) :
QWidget(parent)
{

QPushButton *rollDice = new QPushButton("Roll Dice!");
rollDice->show();

QPushButton *close = new QPushButton("Close app");
close->show();

connect( rollDice, SIGNAL(clicked()), this, SLOT(randomizer()) );
connect( close, SIGNAL(clicked()), this, SLOT(quit()) );
}void DiceWidget::paintEvent (QPaintEvent *event)
{

setMinimumSize(150, 150-BORDER);

int diceSize = width() < height() ? width(): height();
diceSize -= 2 * BORDER + 1;

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
painter.setBrush(Qt::white);

painter.drawRoundedRect( ( width() - diceSize ) / 2,
( height() - diceSize ) / 2,
diceSize, diceSize,
15, 15, Qt::RelativeSize);

painter.setBrush(Qt::black);

switch(value)
{
case 1:
// SHORTENED: draws the ellipse...
break;

case 2:

// draws one more ellipse... (and so on)
break;

// ... until value 6

case 6:

// draws six ellipses
break;
}

}void DiceWidget::randomizer(void)
{
value = rand() % 6 + 1;
update();
}

Я надеюсь, что это не слишком запутанно, и вы можете понять мою концепцию. Я много искал, но не могу найти решение, которое подходит для моего приложения.

Заранее спасибо!

1

Решение

Причина, по которой вы увидели кнопку 1) в окне игры в кости, заключается в том, что вы, очевидно, создали GridLayout в конструкторе DiceWidget и установили для его родителя значение this (DiceWidget). Поэтому ваше окно для игры в кости получает gridLayout, и когда вы добавляете свою кнопку в макет, оно будет отображаться вместе с вашими игральными костями в том же окне.

Добавьте следующее в ваш конструктор DiceWidget:

DiceWidget::DiceWidget(QWidget *parent) : QWidget(parent)
{
QPushButton *rollDice = new QPushButton("Roll Dice!");
QPushButton *close = new QPushButton("Close app");

QWidget *buttonWindow = new QWidget;
QGridLayout *diceLayout = new QGridLayout(buttonWindow);
diceLayout->addWidget(rollDice, 0, 0, 1, 1);
diceLayout->addWIdget(close, 0, 1, 1, 1);
buttonWindow->show();

connect( rollDice, SIGNAL(clicked()), this, SLOT(randomizer()) );
connect( close, SIGNAL(clicked()), this, SLOT(quit()) );
}
2

Другие решения


По вопросам рекламы [email protected]