在Qt中,我正在编写一个“游戏”,向您显示随机数字的绘制骰子。它实际上非常简单,但对我来说是一个新手。
到目前为止,我已经实现了以下小部件,功能等等:
1)一个Button,指的是一个选择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();
}
我希望它不会太混乱,你可以了解我的概念。我经常搜索,但找不到适合我应用的解决方案。
提前致谢!
答案 0 :(得分:2)
您在骰子窗口中看到按钮1)的原因是因为您显然在DiceWidget的构造函数中创建了GridLayout并将其父级设置为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()) );
}