Qt:一个中有两个按钮,另一个窗口中有一个骰子

时间:2015-05-16 16:15:43

标签: c++ qt button window paint

在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();
}

我希望它不会太混乱,你可以了解我的概念。我经常搜索,但找不到适合我应用的解决方案。

提前致谢!

1 个答案:

答案 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()) );
}