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