Qt:一个是两个按钮,一个是骰子 window

Qt: Two buttons in one, a dice in another window

在 Qt 中,我正在编写一个 "game" 程序,它会向您显示带有随机数的骰子。其实很简单,但对我这个新手来说还是挺难的。

到目前为止,我已经实现了以下小部件、功能等:

1) 一个 Button,它指的是一个在 1 到 6 之间随机取值的插槽

2) 关闭应用程序的按钮

3) 一个骰子(painter.drawRoundedRect & painter.drawEllipse 有 6 种可能性)。

我希望按钮 1) 和按钮 2) 在同一个 window 中显示,而骰子 3) 在另一个 window 中显示。但是,现在这两个按钮一分为二,每个 windows 并且骰子(正确)显示在单独的 window 中(应该如此)。

如果我创建一个新的 QGridLayout 并向其中添加按钮 1) 小部件,它会突然出现在骰子中 window!我很困惑这实际上是如何工作的。

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

我希望它不会太混乱,您可以了解我的概念。我搜索了很多,但找不到适合我的应用程序的解决方案。

提前致谢!

之所以在骰子window中看到按钮1)是因为您显然在DiceWidget 的构造函数中创建了GridLayout 并将其父级设置为this(DiceWidget)。因此,您的骰子 window 获得 gridLayout,当您将按钮添加到布局时,它会因此与您的骰子一起出现在同一个 window.

将以下内容添加到您的 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()) );
}