Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-强制关闭按钮点击(信号/插槽问题)_C++_Qt_Qt4 - Fatal编程技术网

C++ Qt-强制关闭按钮点击(信号/插槽问题)

C++ Qt-强制关闭按钮点击(信号/插槽问题),c++,qt,qt4,C++,Qt,Qt4,不确定为什么这不起作用,但连接(按钮、信号(单击())、此、插槽(添加菜单())force在我单击按钮时关闭应用程序 mainview.h #ifndef MAINVIEW_H #define MAINVIEW_H #include <QtGui/QMainWindow> #include <QtGui/QScrollArea> #include <QtGui/QFrame> #include <QtGui/QVBoxLayout> #inclu

不确定为什么这不起作用,但连接(按钮、信号(单击())、此、插槽(添加菜单())force在我单击按钮时关闭应用程序

mainview.h

#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QtGui/QMainWindow>
#include <QtGui/QScrollArea>
#include <QtGui/QFrame>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QGroupBox>
#include <QtGui/QFormLayout>
#include <QtGui/QMessageBox>

#include <QtCore/QPointer>
#include <QtCore/QFile>
#include <QtCore/QIODevice>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>

#include <QtXml/QXmlStreamReader>
#include <QtDebug>
#include <QBool>
#include <QSignalMapper>
#include <QStackedLayout>
#include <QSize>
#include <QPalette>

//
// MainView
//

class MainView: public QMainWindow {

    Q_OBJECT

public:
    MainView(QWidget *parent = 0);
    ~MainView();

private:
    void buildTabMenuBar(int index);

public slots:
    void activeTabChanged(int index);

signals:

private:
    QTabWidget* tabWidget;

};

//
// Tab1
//

class QMyWidget1: public QWidget {

    Q_OBJECT

public:
    QMyWidget1(QWidget *parent = 0);
    ~QMyWidget1();

public slots:
    void runOnTabSelect();
    void addMenu();

signals:

private:
    QPointer<QVBoxLayout> _layout;
    QPointer<QVBoxLayout> _layoutToAdd;

};

#endif // MAINVIEW_H
\ifndef main view\u H
#定义主视图
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//
//主视图
//
类主视图:公共QMainWindow{
Q_对象
公众:
主视图(QWidget*parent=0);
~MainView();
私人:
void buildTabMenuBar(int索引);
公众时段:
void activeTabChanged(int索引);
信号:
私人:
QTabWidget*tabWidget;
};
//
//表1
//
类QMyWidget1:publicqwidget{
Q_对象
公众:
QMyWidget1(QWidget*parent=0);
~QMyWidget1();
公众时段:
void runOnTabSelect();
void addMenu();
信号:
私人:
QPointer\u布局;
QPointer_layoutToAdd;
};
#endif//MAINVIEW\u H
mainview.cpp

#include "mainview.h"

#include <QtGui>
#include <QApplication>
#include <QPixmap>
#include <QSize>

//
// Tabs Main
//

MainView::MainView(QWidget *parent) : QMainWindow(parent) {

    setContextMenuPolicy(Qt::NoContextMenu);
    this->setWindowTitle("Main");

    //create tabwidget
    tabWidget = new QTabWidget(this);

    //tab changes
    QObject::connect(tabWidget, SIGNAL(currentChanged(int)),this, SLOT(activeTabChanged(int)));

    //tab 1
    QMyWidget1* widget1 = new QMyWidget1();

    QScrollArea* scroll1 = new QScrollArea();
    scroll1->setBackgroundRole(QPalette::Dark);
    scroll1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    scroll1->setWidget(widget1);

    tabWidget->addTab(scroll1, "Tab1"); 

    //create stacked layout
    QStackedLayout *stackedLayout = new QStackedLayout;

    //add widgets to stack
    stackedLayout->addWidget(tabWidget);

    //make fullscreen eventually, won't do this automatically
    stackedLayout->setGeometry(QRect(0,0,350,600));

    QVBoxLayout *_layout = new QVBoxLayout;
    _layout->addLayout(stackedLayout);
    setLayout(_layout);

    //remove context menu from all widgets
#ifdef Q_OS_SYMBIAN
    QWidgetList widgets = QApplication::allWidgets();
    QWidget* w = 0;
    foreach(w,widgets) {

            w->setContextMenuPolicy(Qt::NoContextMenu);

    }
#endif
}

MainView::~MainView() {

}

void MainView::activeTabChanged(int index) {

    //active tab
    buildTabMenuBar(index);

}

void MainView::buildTabMenuBar(int index) {

    //clear current menu
    QMenuBar* menubar = menuBar();
    menubar->clear();

    //build new menu into active tab
    switch (index) {
    case 0:
    {
        menubar->addAction("", tabWidget->widget(index), SLOT(runOnTabSelect()));
        break;
    }
    default:
    {
        break;
    }
    };
}

//
// Tab1 Content
//

QMyWidget1::QMyWidget1(QWidget *parent) : QWidget(parent) {

    setContextMenuPolicy(Qt::NoContextMenu);

    QVBoxLayout* _layout = new QVBoxLayout(this);

    //make button

    QPushButton* button = new QPushButton("Just a button");
    button->setStyleSheet("QPushButton { border-left: 1px solid white; border-right: 1px solid white; border-top: 1px solid white; border-bottom:none; border-radius: 3px; background-color: #404040; width: 350px; height:90px; font-size: 15px; font-family: georgia, garamond, serif; margin-bottom:3px; } QPushButton:pressed { background-color: white; }");

    button->setIcon(QIcon("c://right_arrow.png"));
    button->setLayoutDirection(Qt::LeftToRight);
    button->setIconSize(QSize(32,32));
    _layout->addWidget(button);

    **connect(button, SIGNAL(clicked()), this, SLOT(addMenu()));**

    this->setLayout(_layout);

}

QMyWidget1::~QMyWidget1() {

}

void QMyWidget1::runOnTabSelect() {

}

void QMyWidget1::addMenu() {

    _layoutToAdd = new QVBoxLayout;

    QPushButton* button = new QPushButton("New Button");
    _layoutToAdd->addWidget(button);

    _layout->insertLayout(0, _layoutToAdd, 0);

}
#包括“mainview.h”
#包括
#包括
#包括
#包括
//
//主选项卡
//
MainView::MainView(QWidget*父项):QMainWindow(父项){
setContextMenuPolicy(Qt::NoContextMenu);
此->设置窗口标题(“主”);
//创建tabwidget
tabWidget=新的QTabWidget(此);
//选项卡更改
连接(tabWidget,信号(currentChanged(int)),这个,插槽(activeTabChanged(int));
//表1
QMyWidget1*widget1=新的QMyWidget1();
QScrollArea*scroll1=新的QScrollArea();
scroll1->setBackgroundRole(QPalette::Dark);
scroll1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scroll1->setWidget(widget1);
tabWidget->addTab(滚动1,“Tab1”);
//创建堆叠布局
QStackedLayout*stackedLayout=新QStackedLayout;
//将小部件添加到堆栈
stackedLayout->addWidget(tabWidget);
//最终实现全屏显示,不会自动执行此操作
stackedLayout->setGeometry(QRect(0,0350600));
QVBoxLayout*_layout=新的QVBoxLayout;
_布局->添加布局(stackedLayout);
setLayout(_布局);
//从所有小部件中删除上下文菜单
#ifdef Q_OS_SYMBIAN
qwidgetlistwidgets=QApplication::allWidgets();
QWidget*w=0;
foreach(w,widgets){
w->setContextMenuPolicy(Qt::NoContextMenu);
}
#恩迪夫
}
MainView::~MainView(){
}
void MainView::activeTabChanged(int索引){
//活动选项卡
buildTabMenuBar(索引);
}
void MainView::buildTabMenuBar(int索引){
//清除当前菜单
QMenuBar*menubar=menubar();
菜单栏->清除();
//将新菜单构建到活动选项卡中
开关(索引){
案例0:
{
菜单栏->添加操作(“,选项卡小部件->小部件(索引),插槽(runOnTabSelect());
打破
}
违约:
{
打破
}
};
}
//
//表1内容
//
QMyWidget1::QMyWidget1(QWidget*parent):QWidget(parent){
setContextMenuPolicy(Qt::NoContextMenu);
QVBoxLayout*_layout=新的QVBoxLayout(本);
//制作按钮
QPushButton*按钮=新的QPushButton(“只是一个按钮”);
按钮->设置样式表(“QPushButton{border left:1px纯白;border right:1px纯白;border top:1px纯白;border bottom:无;border radius:3px;background color:404040;width:350px;height:90px;font size:15px;font family:georgia,garamond,serif;border bottom:3px;}QPushButton:按下{背景色:白色;}”);
按钮->设置图标(QIcon(“c://right\u arrow.png”);
按钮->设置布局方向(Qt::LeftToRight);
按钮->设置图标大小(QSize(32,32));
_布局->添加小部件(按钮);
**连接(按钮、信号(单击())、此、插槽(添加菜单())**
此->设置布局(_布局);
}
QMyWidget1::~QMyWidget1(){
}
void QMyWidget1::runOnTabSelect(){
}
void QMyWidget1::addMenu(){
_LayoutLoadD=新的QVBoxLayout;
QPushButton*按钮=新的QPushButton(“新按钮”);
_LayoutLoadd->addWidget(按钮);
_布局->插入布局(0,_layoututtoadd,0);
}

第一步,是单击还是功能

1,将函数的内容临时替换为空内容


2,然后确定函数中哪个调用正在崩溃-是否有调试器?

您的成员变量\u布局显然未初始化

此代码:

 QVBoxLayout *_layout = new QVBoxLayout;
_layout->addLayout(stackedLayout);
setLayout(_layout);
创建与成员变量_布局不同的局部变量_布局。 当您为_布局(成员)使用QPointer时,它被初始化为NULL,这将导致addMenu()插槽中的崩溃