簡體   English   中英

QWidget如何獲得“整個”父母?

[英]How can a QWidget get the “entire” parent?

我已經在MainWindow.cpp中實例化了一個widgetClass。 我想將“ this”傳遞給此小部件,而不僅僅是(QWidget *父級),而且還有(MainWindow *父級)。 但是在構建時,widgetClass在MainWindow之前建立,因此會出錯。

我想進入MainWindow中的instanceVariables嗎?

即:

myWidget(QWidget* parent, MainWindow* parent);

這樣的任務有一些問題。也許是因為您必須使用轉發聲明在一個包含第一個類的類中包含一個類。或者也許QWidget的默認構造函數將第一個參數作為默認值參數..您的錯誤到底是什么?

無論如何,這是一個完整的示例:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mywidget.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    int foo(int n);
private:
    Ui::MainWindow *ui;

    MyWidget *w;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    w = new MyWidget(this);
    this->setCentralWidget(w);
}

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

int MainWindow::foo(int n)
{
    std::cout << "foo" << std::endl;
    return n+42;
}

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class MainWindow;

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(MainWindow *main, QWidget *parent = 0);
signals:
public slots:
};

#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include "mainwindow.h"
#include <iostream>

MyWidget::MyWidget(MainWindow *main, QWidget *parent) :
    QWidget(parent)
{
    std::cout << main->foo(0) << std::endl;
}

這有幫助嗎?

nkint提出的答案是最干凈的方法。 但是,如果您沒有時間或無法更改軟件的體系結構,則會有快速的技巧:

如果您確定 MyWidget的父MyWidgetQMainWindow ,則可以簡單地執行以下操作:

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QMainWindow * main = static_cast<QMainWindow*>(parent);
    std::cout << main->foo(0) << std::endl;
}

如果不確定,即實際上可能不是QMainWindow ,則可以執行以下操作:

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QMainWindow * main = qobject_cast<QMainWindow*>(parent);
    // here, main is null if and only if parent was not a QMainWindow
    if(main)
        std::cout << main->foo(0) << std::endl;
}

qobject_castdynamic_cast相似。 更准確地說,文檔說:

qobject_cast()函數的行為與標准C ++ dynamic_cast()相似,其優點在於它不需要RTTI支持,並且可以跨動態庫邊界工作。

qobject_cast()也可以與接口結合使用; 有關詳細信息,請參見“即插即用”示例。

警告 :如果未使用Q_OBJECT宏聲明T,則此函數的返回值不確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM