QT中对主窗口的引用

Posted

技术标签:

【中文标题】QT中对主窗口的引用【英文标题】:The reference to the main window in QT 【发布时间】:2017-01-09 20:14:53 【问题描述】:

我在QT角色创建器中制作了允许您绘制服装的各个部分,但我想添加一个选项让用户自己可以选择外观,例如可用的鞋子,所以我创建了一个新的鞋子窗口和在那里我设置了 6 个按钮,它们只是这些鞋子的图像,我希望用户可以单击主窗口中的一个按钮,在 qlabel 中接收到他的有趣图片,但不太知道如何连接。我会寻求帮助!我真的很感激!!!对不起我的英语,但我来自波兰。

主窗口.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

主窗口.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);

【问题讨论】:

对变量/函数使用英文名称可以让更多人为您提供帮助。 我知道,但是这里的变量/函数的波兰名字太多了,所以我不能更改它,因为它会太长。 您的问题到底是什么?你的意思是你不知道如何连接?您要连接到哪些插槽,哪些变量引用您要连接的按钮?到目前为止,您尝试了什么,发生了什么?您是如何尝试调试代码的? 【参考方案1】:

我将这个问题解释为:

如何从我的其他小部件代码更新主窗口小部件 应用?

好吧,您需要指向QMainWindow 的指针,这通常是基于小部件的应用程序中唯一的主窗口。您可以创建一个指向QMainWindow 的全局指针变量,或者尝试像这样找到它:

// 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 );

【讨论】:

【参考方案2】:

回答标题

QT中对主窗口的引用

在您的代码中,您需要在构造函数中将主窗口传递给您的子窗口,然后通过parent()parentWidget() 使用它。

所以在你的代码中:

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

但是当子对话框“知道”父槽时通常是个坏主意。更好的做法是在主窗口代码中建立连接。 对于子对话框中的这个声明信号,例如mySignal()。然后将按钮的clicked() 信号连接到您的新信号,然后在主窗口中进行最终连接:

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

希望我理解你的问题是正确的。

【讨论】:

以上是关于QT中对主窗口的引用的主要内容,如果未能解决你的问题,请参考以下文章

[Qt及Qt Quick开发实战精解] 第1章 多文档编辑器

Qt 中对 NetWkstaUserGetInfo 的未定义引用,但在 VS 中有效

qt creator源码全方面分析(2-10)

C语言如何在子函数中对主函数中的二维数组值进行修改? 二维数组已经在主函数中用动态数组分配了空间。

QT 常用控件

Qt5.5 为啥不显示错误信息?