C++ Qt-强制关闭按钮点击(信号/插槽问题)
不确定为什么这不起作用,但连接(按钮、信号(单击())、此、插槽(添加菜单())force在我单击按钮时关闭应用程序 mainview.hC++ 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
#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()插槽中的崩溃