Pregunta

I had a console-game that was written on c++ and since I am currently trying to learn Qt I decided to add GUI to this program as an exercise. So there's main window named "gui" that inherits Qwidget. It has layout QHBoxLayout* main_h_lo. Which has 2 added layouts: 1. QStackedLayout* leftpart, 2. QGridLayout* deck. The first is some sort of menu-part. It has 4 different widgets with their layouts. For example choosing game mode or printing game score. And second layout - deck - is game table, similar to chessboard. There's constructor code which I suppose contains the problem:

gui::gui(QWidget *parent) :
    QWidget(parent), pgame(nullptr)
{
    QHBoxLayout* main_h_lo = new QHBoxLayout;
    main_h_lo->setMargin(0);
    main_h_lo->setSpacing(0);
    setLayout(main_h_lo);
    //leftpart-widgets initialization:

    bot_or_playerW = new QWidget;
    QVBoxLayout* bot_or_playerL = new QVBoxLayout; 
    bot_or_playerL->addWidget(new QLabel("Choose game mode"));
    QPushButton* qpb1 = new QPushButton("vs Human");
    QPushButton* qpb2 = new QPushButton("vs Bot");
    QObject::connect(qpb1, SIGNAL(clicked()), SLOT(pvp()));
    QObject::connect(qpb2, SIGNAL(clicked()), SLOT(pvb()));
    bot_or_playerL->addWidget(qpb1);
    bot_or_playerL->addWidget(qpb2);
    bot_or_playerW->setLayout(bot_or_playerL);

    choosing_colourW = new QWidget;
    QVBoxLayout* choosing_colourL = new QVBoxLayout; 
    choosing_colourL->addWidget(new QLabel("Choose your colour"));
    QPushButton* qpb3 = new QPushButton("white(2nd turn)");
    QPushButton* qpb4 = new QPushButton("black(1st turn)");
    QObject::connect(qpb3, SIGNAL(clicked()), SLOT(chwh()));
    QObject::connect(qpb4, SIGNAL(clicked()), SLOT(chbl()));
    choosing_colourL->addWidget(qpb3);
    choosing_colourL->addWidget(qpb4);
    choosing_colourW->setLayout(bot_or_playerL);

    score_lturnW = new QWidget;
    QVBoxLayout* score_lturnL = new QVBoxLayout; 
    lturn = new QLabel; 
    pturn = new QLabel;
    score = new QLabel;
    score_lturnL->addWidget(lturn);
    score_lturnL->addWidget(pturn);
    score_lturnL->addWidget(score);
    score_lturnW->setLayout(score_lturnL);

    after_gameW = new QWidget;
    QVBoxLayout* after_gameL = new QVBoxLayout; 
    winner = new QLabel;
    offer_to_play_again = new QLabel("Wanna play again?");
    QPushButton* qpb5 = new QPushButton("yes");
    QObject::connect(qpb5, SIGNAL(clicked()), SLOT(restart()));
    QPushButton* qpb6 = new QPushButton("no");
    QObject::connect(qpb6, SIGNAL(clicked()), qApp, SLOT(quit()));
    after_gameW->setLayout(after_gameL);

    leftpart = new QStackedLayout;
    leftpart->addWidget(bot_or_playerW);
    leftpart->addWidget(choosing_colourW);
    leftpart->addWidget(score_lturnW);
    leftpart->addWidget(after_gameW);

    //"rightpart" init:

    deck = new QGridLayout;
    deck->setMargin(0);
    deck->setSpacing(0);

    e_pic = QPixmap("empty.png");
    b_pic = QPixmap("black.png");
    w_pic = QPixmap("white.png");
    pic_sz = e_pic.size();

    for (int i = 0; i < 8; ++i)
        for (int j = 0; j < 8; ++j)
        {
            QPushButton* tqpb = new QPushButton;
            tqpb->setIcon(e_pic);
            tqpb->setIconSize(pic_sz);

            std::stringstream ss;
            std::string s;
            ss << i << j;
            ss >> s;

            tqpb->setObjectName(s.c_str());
            deck->addWidget(tqpb, i, j);
            connect(tqpb, SIGNAL(clicked()), SLOT(turn_try()));
        }

    main_h_lo->addLayout(leftpart);
    main_h_lo->addLayout(deck);
    leftpart->setCurrentWidget(bot_or_playerW);
}

I get no error or warning. The deck part is scary and ugly but it is as expected :D. The "menu" part does not show up - that is the problem. Screen: http://i.imgur.com/Sh9PU9N.jpg .

¿Fue útil?

Solución

Some comments about you code -

  1. A layout can be given the parent on construction and it will automatically become the default layout. This saves you one command, but makes it more implicit. It all depends on what you prefer - implicit or explicit.

  2. Loose the QObject::connect. A simple 'connect' will do.

  3. Are you sure "black(1st turn)" is correct? In a conventional chess game, white generally goes first.

  4. You can avoid std::stringstream and use QString::number instead.

The problem has already been mentioned by 'hyde'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top