从另一个类访问Mainwindows私有变量的正确方法

时间:2012-06-03 05:12:26

标签: c++ qt

我正在开发一个程序,我创建了几个堆叠的窗口,以便使用不同的功能。这些窗口是在自己独立的类中制作的。其中一个堆叠的窗口有几个停靠点,我想让它们从窗口菜单切换到显示或隐藏它们。如果它们是mainwindow类的一部分,那么我可以这样做但是文件很大。我的问题是,当我让编辑器类继承主窗口时,我似乎无法让布局显示,因为主窗口已经有了布局。即使这样,编译器仍然会为将操作添加到菜单的行引发错误。有没有人建议如何将它们保存在单独的类中,但仍然可以使用mainwindow类的私有成员。感谢先进的帮助!

调用编辑器页面的主窗口的一部分

MainWindow::MainWindow(QWidget *parent)
{
createActions();
createMenu();
createStatusBar();
createDocks();

createMainWidget();

readSettings();

setWindowTitle("Black Ops Bsuiness Group's ERP System - Version 0.0.0.1");
}

void MainWindow::createMainWidget()
{
contentsIconWidget = new QListWidget();
contentsIconWidget->setViewMode(QListView::IconMode);
contentsIconWidget->setIconSize(QSize(70,70));
contentsIconWidget->setMovement(QListView::Static);
contentsIconWidget->setMaximumWidth(75);
contentsIconWidget->setMinimumWidth(75);
contentsIconWidget->setSpacing(10);
contentsIconWidget->setStyleSheet("QListWidget {background-color:#333;    color:#0099FF;}");

mainContentPages = new QStackedWidget();
mainContentPages->addWidget(new HomePage);
mainContentPages->addWidget(new AnalyticsPage);
mainContentPages->addWidget(new EditorPage);
mainContentPages->setStyleSheet("QStackedWidget {border:1px solid #888;}");
setCentralWidget(mainContentPages);

createIcons();
contentsIconWidget->setCurrentRow(0);

QHBoxLayout *hMainLayout = new QHBoxLayout();
hMainLayout->addWidget(contentsIconWidget,0);
hMainLayout->addWidget(mainContentPages,0);
hMainLayout->setSpacing(0);
hMainLayout->setMargin(0);

QFrame *mFrame = new QFrame(this);
mFrame->setLayout(hMainLayout);
setCentralWidget(mFrame);
}

存储不同视图状态布局的视图源页面的一部分

EditorPage::EditorPage(QWidget *parent) : QWidget(parent)
{
mdiArea = new QMdiArea;
mdiToolBox = new QToolBox;

QDockWidget *dock = new QDockWidget(tr("SQL Manager"));
//MainWindow::windowMenu->addAction(dock->toggleViewAction());
//MainWindow::windowMenu->addAction(dock->toggleViewAction());

QDockWidget *dock1 = new QDockWidget(tr("SQL Manager"));

QSplitter *splitter = new QSplitter();
splitter->setOrientation(Qt::Vertical);
splitter->addWidget(mdiArea);
splitter->addWidget(dock);

QSplitter *splitter1 = new QSplitter();
splitter1->setOrientation(Qt::Horizontal);
splitter1->addWidget(dock1);
splitter1->addWidget(splitter);

QHBoxLayout *mainLayout = new QHBoxLayout();
mainLayout->addWidget(splitter1);
mainLayout->setSpacing(0);
mainLayout->setMargin(0);
setLayout(mainLayout);

}

视图类的头文件的一部分

class EditorPage : public QWidget
{
public:
EditorPage(QWidget *parent = 0);

private:
QMdiArea *mdiArea;
QToolBox *mdiToolBox;
};

1 个答案:

答案 0 :(得分:1)

Qt方式是使用signals and slots

您的编辑器窗口将获得toggleDock()个插槽(可能采用int或枚举值),主窗口将通过信号调用该插槽(自定义信号,由某个触发的信号) QAction,或来自按钮小部件)。

有了这个,你的类之间就没有静态依赖。

(请注意,将指针存储到Dock小部件作为成员(可能在数组中)可能会使代码更容易编码。)