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

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

本文关键字:窗口 一个 另一个 按钮 两个 Qt      更新时间:2023-10-16

在Qt中,我正在编写一个"游戏",向您展示一个随机数字绘制的骰子。这其实很简单,但对我这个新手来说是相当大的任务。

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

1)一个按钮,指的是一个插槽,它在1到6之间随机选择一个值

2)关闭应用程序的按钮

3)一个画好的骰子(画家)。drawRoundedRect,画家。

我希望按钮1)和按钮2)显示在同一个窗口中,骰子3)显示在另一个窗口中。然而,现在这两个按钮在两个窗口中,骰子(正确地)显示在一个单独的窗口中(应该如此)。

如果我创建一个新的QGridLayout并添加按钮小部件,它会突然出现在骰子窗口中!我很困惑这到底是怎么回事。

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)的原因是因为您显然在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()) );
}