В 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) в окне игры в кости, заключается в том, что вы, очевидно, создали 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()) );
}