简体   繁体   中英

The reference to the main window in QT

I made in QT character creator that allows you to draw individual parts of clothing, but I would like to add an option to the user himself can choose the appearance, for example shoes available, so I created a new window for shoes and there I set the 6 buttons, which are simply images of these shoes and I would so the user can click on a button in the main window receives an interesting picture of him in qlabel, but not too much know how to connect. I would ask for help! I would be really very grateful!!! Sorry for my English, but I'm from Poland.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_przycisk_zamykania_clicked();

    void on_przycisk_informacje_clicked();

    void on_przycisk_powrotu_clicked();

    void on_przycisk_graj_clicked();

    void on_powrot_clicked();

    void on_losuj7_clicked();

    void on_losuj6_clicked();

    void on_losuj5_clicked();

    void on_losuj4_clicked();

    void on_losuj3_clicked();

    void on_losuj2_clicked();

    void on_losuj1_clicked();

    void on_wybierz7_clicked();

private:
    Ui::MainWindow* ui;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPixmap"
#include "QPalette"
#include "buty.h"
#include "QObject"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->opis->setTextFormat(Qt::RichText);
    ui->opis->setTextInteractionFlags(Qt::TextBrowserInteraction);
    ui->opis->setOpenExternalLinks(true);

    ui->copyright->setTextFormat(Qt::RichText);
    ui->copyright >setTextInteractionFlags(Qt::TextBrowserInteraction);
    ui->copyright->setOpenExternalLinks(true);

    QPalette *palette1 = new QPalette();
    palette1->setColor(QPalette::Text,Qt::white);
    ui->imie->setPalette(*palette1);

    QPalette *palette2 = new QPalette();
    palette2->setColor(QPalette::Text,Qt::white);
    ui->nazwisko->setPalette(*palette2);

    QPalette *palette3 = new QPalette();
    palette3->setColor(QPalette::Text,Qt::white);
    ui->wiek->setPalette(*palette3);

    QPalette *palette4 = new QPalette();
    palette4->setColor(QPalette::Text,Qt::white);
    ui->info->setPalette(*palette4);

    QPalette *palette5 = new QPalette();
    palette5->setColor(QPalette::Text,Qt::white);
    ui->ocena->setPalette(*palette5);

    //Buty = new Buty(this);
         //connect(Buty,SIGNAL(on_buty1_clicked()),this,SLOT(on_buty1_clicked));
}

    MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_przycisk_zamykania_clicked()
{
    close();
}

void MainWindow::on_przycisk_informacje_clicked()
{
    ui->stackedWidget->setCurrentIndex(1);
}

void MainWindow::on_przycisk_powrotu_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_przycisk_graj_clicked()
{
    ui->stackedWidget->setCurrentIndex(2);
}

void MainWindow::on_powrot_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_losuj7_clicked()
{
    ui->pytajnik7->setStyleSheet("background-color:#040f1e;");

    int losowanie7;

    srand (time(NULL));

    losowanie7 = rand() % 6 + 1;

    if (losowanie7 == 1)
    {
        QPixmap     b1(":/pliki_buty/img/losowanie_img/buty_img/buty1_wynik.png");
        ui->pytajnik7->setPixmap(b1);
    }

if (losowanie7 == 2)
{
    QPixmap b2(":/pliki_buty/img/losowanie_img/buty_img/buty2_wynik.png");
    ui->pytajnik7->setPixmap(b2);
}

if (losowanie7 == 3)
{
    QPixmap b3(":/pliki_buty/img/losowanie_img/buty_img/buty3_wynik.png");
    ui->pytajnik7->setPixmap(b3);
}

if (losowanie7 == 4)
{
    QPixmap b4(":/pliki_buty/img/losowanie_img/buty_img/buty4_wynik.png");
    ui->pytajnik7->setPixmap(b4);
}

if (losowanie7 == 5)
{
   QPixmap b5(":/pliki_buty/img/losowanie_img/buty_img/buty5_wynik.png");
   ui->pytajnik7->setPixmap(b5);
}

if (losowanie7 == 6)
{
    QPixmap b6(":/pliki_buty/img/losowanie_img/buty_img/buty6_wynik.png");
    ui->pytajnik7->setPixmap(b6);
}
}

void MainWindow::on_losuj6_clicked()
{
ui->pytajnik6->setStyleSheet("background-color:#040f1e;");

int losowanie6;

srand (time(NULL));

losowanie6 = rand() % 6 + 1;

if (losowanie6 == 1)
{
    QPixmap s1(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie1_wynik.png");
    ui->pytajnik6->setPixmap(s1);
}

if (losowanie6 == 2)
{
    QPixmap s2(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie2_wynik.png");
    ui->pytajnik6->setPixmap(s2);
}

if (losowanie6 == 3)
{
    QPixmap s3(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie3_wynik.png");
    ui->pytajnik6->setPixmap(s3);
}

if (losowanie6 == 4)
{
    QPixmap s4(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie4_wynik.png");
    ui->pytajnik6->setPixmap(s4);
}

if (losowanie6 == 5)
{
    QPixmap s5(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie5_wynik.png");
    ui->pytajnik6->setPixmap(s5);
}

if (losowanie6 == 6)
{
    QPixmap s6(":/pliki_spodnie/img/losowanie_img/spodnie_img/spodnie6_wynik.png");
    ui->pytajnik6->setPixmap(s6);
}
}

void MainWindow::on_losuj5_clicked()
  {
    ui->pytajnik5->setStyleSheet("background-color:#040f1e;");

int losowanie5;

srand (time(NULL));

losowanie5 = rand() % 6 + 1;

if (losowanie5 == 1)
{
    QPixmap k1(":/pliki_korpus/img/losowanie_img/korpus_img/korpus1_wynik.png");
    ui->pytajnik5->setPixmap(k1);
}

if (losowanie5 == 2)
{
    QPixmap k2(":/pliki_korpus/img/losowanie_img/korpus_img/korpus2_wynik.png");
    ui->pytajnik5->setPixmap(k2);
}

if (losowanie5 == 3)
{
    QPixmap k3(":/pliki_korpus/img/losowanie_img/korpus_img/korpus3_wynik.png");
    ui->pytajnik5->setPixmap(k3);
}

if (losowanie5 == 4)
{
    QPixmap k4(":/pliki_korpus/img/losowanie_img/korpus_img/korpus4_wynik.png");
    ui->pytajnik5->setPixmap(k4);
}

if (losowanie5 == 5)
{
    QPixmap k5(":/pliki_korpus/img/losowanie_img/korpus_img/korpus5_wynik.png");
    ui->pytajnik5->setPixmap(k5);
}

if (losowanie5 == 6)
{
    QPixmap k6(":/pliki_korpus/img/losowanie_img/korpus_img/korpus6_wynik.png");
    ui->pytajnik5->setPixmap(k6);
}
}

void MainWindow::on_losuj4_clicked()
{
ui->pytajnik4->setStyleSheet("background-color:#040f1e;");

int losowanie4;

srand (time(NULL));

losowanie4 = rand() % 6 + 1;

if (losowanie4 == 1)
{
    QPixmap w1(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy1_wynik.png");
    ui->pytajnik4->setPixmap(w1);
}

if (losowanie4 == 2)
{
    QPixmap w2(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy2_wynik.png");
    ui->pytajnik4->setPixmap(w2);
}

if (losowanie4 == 3)
{
    QPixmap w3(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy3_wynik.png");
    ui->pytajnik4->setPixmap(w3);
}

if (losowanie4 == 4)
{
    QPixmap w4(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy4_wynik.png");
    ui->pytajnik4->setPixmap(w4);
}

if (losowanie4 == 5)
{
    QPixmap w5(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy5_wynik.png");
    ui->pytajnik4->setPixmap(w5);
}

if (losowanie4 == 6)
{
    QPixmap w6(":/pliki_wlosy/img/losowanie_img/wlosy_img/wlosy6_wynik.png");
    ui->pytajnik4->setPixmap(w6);
}
}

void MainWindow::on_losuj3_clicked()
{
ui->pytajnik3->setStyleSheet("background-color:#040f1e;");

int losowanie3;

srand (time(NULL));

losowanie3 = rand() % 6 + 1;

if (losowanie3 == 1)
{
    QPixmap o1(":/pliki_oczy/img/losowanie_img/oczy_img/oczy1_wynik.png");
    ui->pytajnik3->setPixmap(o1);
}

if (losowanie3 == 2)
{
    QPixmap o2(":/pliki_oczy/img/losowanie_img/oczy_img/oczy2_wynik.png");
    ui->pytajnik3->setPixmap(o2);
}

if (losowanie3 == 3)
{
    QPixmap o3(":/pliki_oczy/img/losowanie_img/oczy_img/oczy3_wynik.png");
    ui->pytajnik3->setPixmap(o3);
}

if (losowanie3 == 4)
{
    QPixmap o4(":/pliki_oczy/img/losowanie_img/oczy_img/oczy4_wynik.png");
    ui->pytajnik3->setPixmap(o4);
}

if (losowanie3 == 5)
{
    QPixmap o5(":/pliki_oczy/img/losowanie_img/oczy_img/oczy5_wynik.png");
    ui->pytajnik3->setPixmap(o5);
}

if (losowanie3 == 6)
{
    QPixmap o6(":/pliki_oczy/img/losowanie_img/oczy_img/oczy6_wynik.png");
    ui->pytajnik3->setPixmap(o6);
}
}

void MainWindow::on_losuj2_clicked()
{
ui->pytajnik2->setStyleSheet("background-color:#040f1e;");

int losowanie2;

srand (time(NULL));

losowanie2 = rand() % 6 + 1;

if (losowanie2 == 1)
{
    QPixmap u1(":/pliki_usta/img/losowanie_img/usta_img/usta1_wynik.png");
    ui->pytajnik2->setPixmap(u1);
}

if (losowanie2 == 2)
{
    QPixmap u2(":/pliki_usta/img/losowanie_img/usta_img/usta2_wynik.png");
    ui->pytajnik2->setPixmap(u2);
}

if (losowanie2 == 3)
{
    QPixmap u3(":/pliki_usta/img/losowanie_img/usta_img/usta3_wynik.png");
    ui->pytajnik2->setPixmap(u3);
}

if (losowanie2 == 4)
{
    QPixmap u4(":/pliki_usta/img/losowanie_img/usta_img/usta4_wynik.png");
    ui->pytajnik2->setPixmap(u4);
}

if (losowanie2 == 5)
{
    QPixmap u5(":/pliki_usta/img/losowanie_img/usta_img/usta5_wynik.png");
    ui->pytajnik2->setPixmap(u5);
}

if (losowanie2 == 6)
{
    QPixmap u6(":/pliki_usta/img/losowanie_img/usta_img/usta6_wynik.png");
    ui->pytajnik2->setPixmap(u6);
}
}

void MainWindow::on_losuj1_clicked()
{
ui->pytajnik1->setStyleSheet("background-color:#040f1e;");

int losowanie1;

srand (time(NULL));

losowanie1 = rand() % 6 + 1;

if (losowanie1 == 1)
{
    QPixmap a1(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria1_wynik.png");
    ui->pytajnik1->setPixmap(a1);
}

if (losowanie1 == 2)
{
    QPixmap a2(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria2_wynik.png");
    ui->pytajnik1->setPixmap(a2);
}

if (losowanie1 == 3)
{
    QPixmap a3(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria3_wynik.png");
    ui->pytajnik1->setPixmap(a3);
}

if (losowanie1 == 4)
{
    QPixmap a4(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria4_wynik.png");
    ui->pytajnik1->setPixmap(a4);
}

if (losowanie1 == 5)
{
    QPixmap a5(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria5_wynik.png");
    ui->pytajnik1->setPixmap(a5);
}

if (losowanie1 == 6)
{
    QPixmap a6(":/pliki_akcesoria/img/losowanie_img/akcesoria_img/akcesoria6_wynik.png");
    ui->pytajnik1->setPixmap(a6);
}
}

void MainWindow::on_wybierz7_clicked()
{
Buty buty;
buty.setModal(true);
buty.exec();
}

buty.h

#ifndef BUTY_H
#define BUTY_H

#include <QDialog>
#include "mainwindow.h"
#include "QObject"

namespace Ui {
class Buty;
}

class Buty : public QDialog
{
    Q_OBJECT

public:
    explicit Buty(QWidget *parent = 0);
    ~Buty();

private slots:
    void on_wroc_do_gry_clicked();

public slots:
    void on_buty1_clicked();

private:
    Ui::Buty* ui;

};

#endif // BUTY_H

buty.cpp

#include "buty.h"
#include "ui_buty.h"
#include "mainwindow.h"
#include "QObject"

Buty::Buty(QWidget *parent) :
QDialog(parent),
ui(new Ui::Buty)
{
ui->setupUi(this);

//QDialog::connect(ui->buty1, SIGNAL(clicked()), QMainWindow, SLOT(pytajnik7()));
connect(ui->buty1, SIGNAL(clicked()), this, SLOT(pytajnik7()));
}

Buty::~Buty()
{
delete ui;
}

void Buty::on_wroc_do_gry_clicked()
{
close();
}

void Buty::on_buty1_clicked()
{
QPixmap b1(":/pliki_buty/img/losowanie_img/buty_img/buty1_wynik.png");
ui->pytajnik7->setPixmap(b1);
}

I interpret the question like:

How can I update the main window widget from other widget code in my app?

Well, you need the pointer to QMainWindow which is usually the only main window in the widget-based app. You can either create a global pointer variable to QMainWindow or try to find it like that:

// TODO: make it template to resolve specific type?
QMainWindow* findMainWindow()
{
    for(QWidget* pWidget : QApplication::topLevelWidgets())
    {
        QMainWindow pMainWnd = qobject_cast<QMainWindow*>(pWidget);
        if (pMainWnd)
           return pMainWnd;
    }
    return nullptr;
}


// UI receives an event that needs to pass the data to main window
void MyWidget::onItemsSelected(const QList<Item>& goods)
{
    MyMainWindow* pMainWindow = qobject_cast<MyMainWindow*>(findMainWindow());
    if (!pMainWindow)
    {
        qWarning() << "Cannot find this app main window!";
        return;
    }
    // make it specific to your data
    pMainWindow->updateGoodsView( goods );
}

To answer on the title

The reference to the main window in QT

in your code you need to pass you mainwindow to your child window in constructor and then use it via parent() or parentWidget() .

So in your code:

void MainWindow::on_wybierz7_clicked()
{
Buty buty(this);  //pay attention to this
buty.setModal(true);
buty.exec();
}
...
Buty::Buty(QWidget *parent) :
QDialog(parent),
ui(new Ui::Buty)
{
ui->setupUi(this);

connect(ui->buty1, SIGNAL(clicked()), parent(), SLOT(pytajnik7()));
}

But usually it is bad idea when child dialog "know" about parent slot. Better practice is to make connection in mainwindow code. For this declare signal in child dialog, eg mySignal() . Then connect clicked() signal of the button to your new signal and then make final connection in mainwindow:

void MainWindow::on_wybierz7_clicked()
{
Buty buty(this);  //pay attention to this
buty.setModal(true);
connect(&buty, SIGNAL(mySignal()), this, SLOT(pytajnik7()));
buty.exec();
}
...

class Buty : public QDialog
{
Q_OBJECT
...
signals:
void mySignal();
...
};

...
Buty::Buty(QWidget *parent) :
QDialog(parent),
ui(new Ui::Buty)
{
ui->setupUi(this);

connect(ui->buty1, SIGNAL(clicked()), this, SIGNAL(mySignal()));
}

Hope i understood your question correct.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM