首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

一个简单的关于QT界面编程的基础有关问题,

2013-01-23 
一个简单的关于QT界面编程的基础问题,急现在想做这么一个功能的界面: 左边有一列两个按钮,按下第一个按钮

一个简单的关于QT界面编程的基础问题,急
现在想做这么一个功能的界面: 左边有一列两个按钮,按下第一个按钮显示一个设置界面。当按下第二个按钮时,根据第一个按钮做的设置调用不同的界面来显示。
受到QT的Examples and Demos的Dialog下的Config Dialog例子启发,左边的按钮用QListWidget来实现,右边的按钮用QStackedWidget来实现。现在遇到的问题是如何访问某个私有成员的私有成员函数的问题,如下代码所示(更详细的代码见附件):
    if(0 == ppage0->pageCombo->currentIndex())   //有问题的地方???
        pagesWidget->setCurrentIndex(1);
    else if (1 == ppage0->pageCombo->currentIndex())   //有问题的地方???
        pagesWidget->setCurrentIndex(2);
我把这个子类声明成public类型的,编译可以过,但是在运行时程序会死掉?
请问各位大侠有没有好的其他方法来实现我这个功能或者是我这个代码错误出现在什么地方?帮帮我这个对编程不懂的小白。

下面是部分代码:
//////configdialog.h///////////////////////////////
#ifndef CONFIGDIALOG_H
#define CONFIGDIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
class QListWidget;
class QListWidgetItem;
class QStackedWidget;
class Page0;
class Page1;
class Page2;
QT_END_NAMESPACE

class ConfigDialog : public QDialog
{
    Q_OBJECT

public:
    ConfigDialog();

public slots:
    void changePage(QListWidgetItem *current, QListWidgetItem *previous);

private:
    void createIcons();

    QListWidget *contentsWidget;
    QStackedWidget *pagesWidget;
    Page0 *ppage0;
    Page1 *ppage1;
    Page2 *ppage2;
};

#endif
/////////configdialog.cpp////////////////////////
#include <QtGui>

#include "configdialog.h"
#include "page0.h"
#include "page1.h"
#include "page2.h"

ConfigDialog::ConfigDialog()
{
    contentsWidget = new QListWidget;
    contentsWidget->setViewMode(QListView::IconMode);
    contentsWidget->setIconSize(QSize(96, 84));
    contentsWidget->setMovement(QListView::Static);
    contentsWidget->setMaximumWidth(128);
    contentsWidget->setSpacing(12);

    pagesWidget = new QStackedWidget;
    ppage0 = new Page0;
    ppage1 = new Page1;
    ppage2 = new Page2;
    pagesWidget->addWidget(ppage0);
    pagesWidget->addWidget(ppage1);
    pagesWidget->addWidget(ppage2);

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

    QHBoxLayout *horizontalLayout = new QHBoxLayout;
    horizontalLayout->addWidget(contentsWidget);
    horizontalLayout->addWidget(pagesWidget, 1);

    setLayout(horizontalLayout);

    setMinimumSize(600, 400);
    setWindowTitle(tr("Config Dialog"));
}

void ConfigDialog::createIcons()
{
    QListWidgetItem *configButton = new QListWidgetItem(contentsWidget);
    configButton->setIcon(QIcon(":/images/config.png"));
    configButton->setText(tr("Configuration"));


    configButton->setTextAlignment(Qt::AlignHCenter);
    configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

    QListWidgetItem *updateButton = new QListWidgetItem(contentsWidget);
    updateButton->setIcon(QIcon(":/images/update.png"));
    updateButton->setText(tr("Update"));
    updateButton->setTextAlignment(Qt::AlignHCenter);
    updateButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

    connect(contentsWidget,
            SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
            this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*)));
}

void ConfigDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous)
{
    if (!current)
        current = previous;

    if(0 == ppage0->pageCombo->currentIndex())
        pagesWidget->setCurrentIndex(1);
    else if (1 == ppage0->pageCombo->currentIndex()) {
        pagesWidget->setCurrentIndex(2);
    }
}

/////////////page0.h//////////////////////
#ifndef PAGE0_H
#define PAGE0_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QLabel;
class QComboBox;
QT_END_NAMESPACE

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

private:
    QLabel *pageLabel;
    QComboBox *pageCombo;
};

#endif // PAGE0_H

/////////////////page0.cpp////////////////////////
#include <QtGui>

#include "page0.h"

Page0::Page0(QWidget *parent)
    : QWidget(parent)
{
    QGroupBox *configGroup = new QGroupBox(tr("Page Selection"));

    QLabel *pageLabel = new QLabel(tr("Pages:"));
    pageCombo = new QComboBox;
    pageCombo->addItem(tr("Page 1"));
    pageCombo->addItem(tr("Page 2"));

    QHBoxLayout *pageLayout = new QHBoxLayout;
    pageLayout->addWidget(pageLabel);
    pageLayout->addWidget(pageCombo);

    QVBoxLayout *configLayout = new QVBoxLayout;
    configLayout->addLayout(pageLayout);
    configGroup->setLayout(configLayout);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(configGroup);
    mainLayout->addStretch(1);
    setLayout(mainLayout);
}

//////////////////page1.h//////////////////////
#ifndef PAGE1_H
#define PAGE1_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QLineEdit;
QT_END_NAMESPACE

class Page1 : public QWidget
{


public:
    Page1(QWidget *parent = 0);

private:
    QLineEdit *p1Line;
};

#endif // PAGE1_H

////////////////////page1.cpp////////////////////////////
#include <QtGui>

#include "page2.h"

Page2::Page2(QWidget *parent)
    : QWidget(parent)
{
    QGroupBox *configGroup = new QGroupBox(tr("Page2"));

    p2Line = new QLineEdit;
    p2Line->setText(tr("This is page 2"));

    QHBoxLayout *pageLayout = new QHBoxLayout;
    pageLayout->addWidget(p2Line);
    pageLayout->addStretch();

    configGroup->setLayout(pageLayout);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(configGroup);
    mainLayout->addStretch(1);
    setLayout(mainLayout);
}
page2 与page1类似,这里就不贴了
[解决办法]
会死掉是你程序的问题,直接访问成员变量是最简单的方式,一般是提供public函数访问私有成员

热点排行