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 中有效