我正在尝试创建一个弹出的对话框,为用户提供6种不同选项。我阅读了有关QDialogButtonBox的文档,但对如何实现它仍然有点困惑。现在我有一个QInputDialog接收玩家的名字,在用户输入该信息后,我想用这个按钮框提示每个玩家。在他们选择了他们想要的东西之后,它将所选索引存储到一个变量中,我可以使用该信息相应地分配它们(不确定这是否是这样做的方法,或者ButtonBox返回一个我可以直接用来分配一个值的值玩家一块)。
我的代码:
hatbutton = new QPushButton(tr("Hat"));
hatbutton->setDefault(true);
carbutton = new QPushButton(tr("Car"));
carbutton ->setDefault(true);
spaceshipbutton = new QPushButton(tr("Spaceship"));
spaceshipbutton->setDefault(true);
basketballbutton = new QPushButton(tr("Basketball"));
basketballbutton -> setDefault(true);
ringbutton = new QPushButton(tr("Ring"));
ringbutton -> setDefault(true);
shoebutton = new QPushButton(tr("Shoe"));
shoebutton ->setDefault(true);
pieces = new QDialogButtonBox(this);
pieces -> addButton(hatbutton, QDialogButtonBox::ActionRole);
pieces -> addButton(carbutton, QDialogButtonBox::ActionRole);
pieces -> addButton(spaceshipbutton, QDialogButtonBox::ActionRole);
pieces -> addButton(basketballbutton, QDialogButtonBox::ActionRole);
pieces -> addButton(ringbutton, QDialogButtonBox::ActionRole);
pieces -> addButton(shoebutton, QDialogButtonBox::ActionRole);
现在问题是按钮框甚至没有弹出。如果有人可以教我如何正确实现它,首先通过使它出现然后以某种方式存储值,它将极大地帮助我。非常感谢你。
如果您需要更多信息来帮我实现,请告知我们。我也在运行qt 4.8
编辑:要改进我的问题,是否可以创建一个既是qinputdialog又是qcombobox组合的对话框?在显示主窗口之前,我希望这些对话框全部打开。
答案 0 :(得分:1)
您可以通过继承QDialog
。
以下是一个例子:
mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
class QLineEdit;
class QComboBox;
class MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
QString getName() const;
int getIndex() const;
private:
QComboBox *comboBox;
QLineEdit *lineEdit;
};
#endif // MYDIALOG_H
mydialog.cpp
#include "mydialog.h"
#include <QDialogButtonBox>
#include <QLayout>
#include <QComboBox>
#include <QLineEdit>
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
QVBoxLayout *layout = new QVBoxLayout;
this->setLayout(layout);
comboBox = new QComboBox; // create combo box and add items to it
QStringList items = QStringList() << "item1" << "item2" << "item3" << "item4";
comboBox->addItems(items);
layout->addWidget(comboBox);
lineEdit = new QLineEdit; // create line edit
layout->addWidget(lineEdit);
// create button box
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
layout->addWidget(buttonBox);
}
QString MyDialog::getName() const
{
return lineEdit->text();
}
int MyDialog::getIndex() const
{
return comboBox->currentIndex();
}
的main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "mydialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
MyDialog myDialog;
if(myDialog.exec()) // shows MyDialog on the screen and waits for the user to close the dialog
{
int index = myDialog.getIndex();
QString name = myDialog.getName();
// do something with these..
w.setPlayerData(index, name);
}
else
return 0;
w.show(); // shows MainWindow on the screen
return a.exec();
}
在MainWindow类中添加如下函数:
void MainWindow::setPlayerData(int _index, const QString &_name)
{
index = _index; // index is a member variable declared somewhere in your mainwindow.h
name = _name; // name is a member variable declared somewhere in your mainwindow.h
}
答案 1 :(得分:0)
您需要将QDialogButtonBox添加到窗口的中央窗口小部件中。我想这是应该帮助你前进的答案: How to add buttons to a main window in Qt?
答案 2 :(得分:0)
dialogbuttonbox不是对话框。 QDialogButtonBox可以是QDialog的一部分。
你可以采用这两种不同的方式。
首先,更灵活的版本是对QDialog进行子类化并手动创建按钮框。
第二种可能性可能就是你想要实现的目标(例如我们使用按钮框和lineedit中的默认按钮来源):
int type = 0;
QDialog *d = new QDialog();
QVBoxLayout *l = new QVBoxLayout();
QLabel *la = new QLabel(tr("Some Question:"));
la->setMinimumHeight(30);
l->addWidget(la);
QLineEdit *le = new QLineEdit();
le->setMinimumHeight(30);
l->addWidget(le);
QDialogButtonBox *b = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,d);
foreach(QPushButton* bu, b->findChildren<QPushButton*>())
bu->setMinimumHeight(40);
connect(b,SIGNAL(accepted()),d,SLOT(accept()));
connect(b,SIGNAL(rejected()),d,SLOT(reject()));
l->addWidget(b);
d->setLayout(l);
d->setWindowFlags(d->windowFlags() | Qt::FramelessWindowHint);
d->setWindowModality(Qt::ApplicationModal);
d->exec();
if(d->result() == QDialog::Rejected)
{
delete le;
delete la;
delete l;
delete b;
delete d;
return;
}
type = le->text().toInt();
注意:您可以使用QScopePointer而不是丑陋的删除部分。但请记住,在从对话框中查询元素时,元素本身和对话框不得删除。