通过存储用户选择的索引值来实现QDialogBu​​ttonBox

时间:2014-04-30 06:00:01

标签: c++ qt user-interface

我正在尝试创建一个弹出的对话框,为用户提供6种不同选项。我阅读了有关QDialogBu​​ttonBox的文档,但对如何实现它仍然有点困惑。现在我有一个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组合的对话框?在显示主窗口之前,我希望这些对话框全部打开。

3 个答案:

答案 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)

您需要将QDialogBu​​ttonBox添加到窗口的中央窗口小部件中。我想这是应该帮助你前进的答案: How to add buttons to a main window in Qt?

答案 2 :(得分:0)

dialogbuttonbox不是对话框。 QDialogBu​​ttonBox可以是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而不是丑陋的删除部分。但请记住,在从对话框中查询元素时,元素本身和对话框不得删除。