• 7169阅读
  • 9回复

为什么我不能实现点击退出菜单就能退出的功能? [复制链接]

上一主题 下一主题
离线chwoozy
 

只看楼主 倒序阅读 楼主  发表于: 2006-05-28
我的程序界面是在QtDesigner生成的ui_untitled.h的基础上加入自己的代码形成的。不过我一直没办法实现主菜单里File->Exit的功能,即使我次次编译都通过也没用。我可是已经把点击菜单的信号与QMainwindow的close()槽连接上了啊,就是代码里的这一句:
  1. connect(action_X, SIGNAL(triggered()), this, SLOT(close()));

我把有关的代码帖出来吧(不好意思,里面的无用信息比较多)
  1. #ifndef UNTITLED_H
  2. #define UNTITLED_H
  3. #include <QtCore/QVariant>
  4. #include <QtGui/QAction>
  5. #include <QtGui/QApplication>
  6. #include <QtGui/QButtonGroup>
  7. #include <QtGui/QGroupBox>
  8. #include <QtGui/QHBoxLayout>
  9. #include <QtGui/QLabel>
  10. #include <QtGui/QMainWindow>
  11. #include <QtGui/QMenu>
  12. #include <QtGui/QMenuBar>
  13. #include <QtGui/QRadioButton>
  14. #include <QtGui/QStatusBar>
  15. #include <QtGui/QVBoxLayout>
  16. #include <QtGui/QWidget>
  17. #include <qwt_wheel.h>
  18. #include <qwt_knob.h>
  19. #include "myplot.h"
  20. #include <qwt_data.h>
  21. #include "myscaledraw.h"
  22. using namespace std;
  23. class Ui_MainWindow:public QMainWindow
  24. {
  25.     Q_OBJECT
  26. signals:
  27.            void situationChanged();
  28. public:
  29.   QAction *action_A;
  30.   QAction *action_X;
  31.   QAction *action_Q;
  32.   QWidget *centralwidget;
  33.   QWidget *widget;
  34.   QHBoxLayout *hboxLayout;
  35.   QGroupBox *groupBox;
  36.   QLabel *label;
  37.   QLabel *label_2;
  38.   QGroupBox *groupBox_3;
  39.   QWidget *widget1;
  40.   QVBoxLayout *vboxLayout;
  41.   QRadioButton *radioButton_5;
  42.   QRadioButton *radioButton_2;
  43.   QRadioButton *radioButton;
  44.   QwtKnob *Knob;
  45.   QwtWheel *wheel;
  46.   QwtWheel *wheel_2;
  47.   QwtWheel *wheel_3;
  48.   QGroupBox *groupBox_2;
  49.   QLabel *label_3;
  50.   QLabel *label_4;
  51.   QGroupBox *groupBox_4;
  52.   QWidget *layoutWidget;
  53.   QVBoxLayout *vboxLayout1;
  54.   QRadioButton *radioButton_6;
  55.   QRadioButton *radioButton_3;
  56.   QRadioButton *radioButton_4;
  57.   QwtKnob *Knob_2;
  58.   QGroupBox *groupBox_5;
  59.   QLabel *label_6;
  60.   QLabel *label_5;
  61.   QwtKnob *Knob_3;
  62.   MyPlot *qwtPlot;
  63.   QMenuBar *menubar;
  64.   QMenu *menu_H;
  65.   QMenu *menu_F;
  66.   QStatusBar *statusbar;
  67.   myscaleDraw *draw;
  68.   QFont font;
  69.  
  70.  
  71.   void setupUi(QMainWindow *MainWindow)
  72.   {
  73.   MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
  74.  
  75.   action_A = new QAction(MainWindow);
  76.   action_A->setObjectName(QString::fromUtf8("action_A"));
  77.   action_X = new QAction(MainWindow);
  78.   action_X->setObjectName(QString::fromUtf8("action_X"));
  79.   action_X->setShortcut(tr("Ctrl+Q"));
  80.   action_X->setStatusTip(tr("Exit the application"));
  81.   action_Q = new QAction(MainWindow);
  82.   action_Q->setObjectName(QString::fromUtf8("action_Q"));
  83.   centralwidget = new QWidget(MainWindow);
  84.   centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
  85.   widget = new QWidget(centralwidget);
  86.   widget->setObjectName(QString::fromUtf8("widget"));
  87.   widget->setGeometry(QRect(590, 10, 260, 301));
  88.   hboxLayout = new QHBoxLayout(widget);
  89.   hboxLayout->setSpacing(6);
  90.   hboxLayout->setMargin(0);
  91.   hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
  92.   groupBox = new QGroupBox(widget);
  93.   groupBox->setObjectName(QString::fromUtf8("groupBox"));
  94.   groupBox->setAlignment(Qt::AlignHCenter);
  95.   label = new QLabel(groupBox);
  96.   label->setObjectName(QString::fromUtf8("label"));
  97.   label->setGeometry(QRect(40, 19, 54, 15));
  98.   label_2 = new QLabel(groupBox);
  99.   label_2->setObjectName(QString::fromUtf8("label_2"));
  100.   label_2->setGeometry(QRect(44, 65, 41, 16));
  101.   groupBox_3 = new QGroupBox(groupBox);
  102.   groupBox_3->setObjectName(QString::fromUtf8("groupBox_3"));
  103.   groupBox_3->setGeometry(QRect(30, 185, 71, 111));
  104.   widget1 = new QWidget(groupBox_3);
  105.   widget1->setObjectName(QString::fromUtf8("widget1"));
  106.   widget1->setGeometry(QRect(11, 22, 50, 77));
  107.   vboxLayout = new QVBoxLayout(widget1);
  108.   vboxLayout->setSpacing(6);
  109.   vboxLayout->setMargin(0);
  110.   vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
  111.   radioButton_5 = new QRadioButton(widget1);
  112.   radioButton_5->setObjectName(QString::fromUtf8("radioButton_5"));
  113.   radioButton_5->setDown(false);
  114.   vboxLayout->addWidget(radioButton_5);
  115.   radioButton_2 = new QRadioButton(widget1);
  116.   radioButton_2->setObjectName(QString::fromUtf8("radioButton_2"));
  117.   radioButton_2->setDown(true);
  118.  
  119.   vboxLayout->addWidget(radioButton_2);
  120.   radioButton = new QRadioButton(widget1);
  121.   radioButton->setObjectName(QString::fromUtf8("radioButton"));
  122.   radioButton->setDown(false);
  123.   vboxLayout->addWidget(radioButton);
  124.   myscaleDraw *draw=new myscaleDraw();
  125.   font.setPointSize(7);
  126.   Knob = new QwtKnob(groupBox);
  127.   Knob->setGeometry(QRect(10, 76, 110, 110));
  128.   Knob->setObjectName(QString::fromUtf8("Knob"));
  129.   Knob->setOrientation(Qt::Horizontal);
  130.   Knob->setScaleDraw(draw);
  131.   Knob->setScale(0.0,10.0,1.0);
  132.   Knob->setScaleMaxMinor(0);
  133.   Knob->setRange(0.0,10.0,1.0);
  134.   Knob->setValue(8.0);
  135.   Knob->setFont(font);
  136.   wheel = new QwtWheel(groupBox);
  137.   wheel->setObjectName(QString::fromUtf8("wheel"));
  138.   wheel->setGeometry(QRect(14, 36, 100, 24));
  139.   wheel->setOrientation(Qt::Horizontal);
  140.   wheel->setRange(-1.0,1.0,0.05);
  141.  
  142.   hboxLayout->addWidget(groupBox);
  143.   groupBox_2 = new QGroupBox(widget);
  144.   groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
  145.   groupBox_2->setAlignment(Qt::AlignHCenter);
  146.   wheel_2 = new QwtWheel(groupBox_2);
  147.   wheel_2->setObjectName(QString::fromUtf8("wheel_2"));
  148.   wheel_2->setGeometry(QRect(14, 36, 100, 24));
  149.   wheel_2->setOrientation(Qt::Horizontal);
  150.   wheel_2->setRange(-1.0,1.0,0.05);    
  151.   label_3 = new QLabel(groupBox_2);
  152.   label_3->setObjectName(QString::fromUtf8("label_3"));
  153.   label_3->setGeometry(QRect(40, 19, 54, 15));
  154.   label_4 = new QLabel(groupBox_2);
  155.   label_4->setObjectName(QString::fromUtf8("label_4"));
  156.   label_4->setGeometry(QRect(44, 65, 41, 16));
  157.   groupBox_4 = new QGroupBox(groupBox_2);
  158.   groupBox_4->setObjectName(QString::fromUtf8("groupBox_4"));
  159.   groupBox_4->setGeometry(QRect(30, 185, 71, 111));
  160.   layoutWidget = new QWidget(groupBox_4);
  161.   layoutWidget->setObjectName(QString::fromUtf8("layoutWidget"));
  162.   layoutWidget->setGeometry(QRect(11, 21, 50, 77));
  163.   vboxLayout1 = new QVBoxLayout(layoutWidget);
  164.   vboxLayout1->setSpacing(6);
  165.   vboxLayout1->setMargin(0);
  166.   vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
  167.   radioButton_6 = new QRadioButton(layoutWidget);
  168.   radioButton_6->setObjectName(QString::fromUtf8("radioButton_6"));
  169.   radioButton_6->setDown(false);
  170.  
  171.   vboxLayout1->addWidget(radioButton_6);
  172.   radioButton_3 = new QRadioButton(layoutWidget);
  173.   radioButton_3->setObjectName(QString::fromUtf8("radioButton_3"));
  174.   radioButton_3->setDown(true);
  175.   vboxLayout1->addWidget(radioButton_3);
  176.   radioButton_4 = new QRadioButton(layoutWidget);
  177.   radioButton_4->setObjectName(QString::fromUtf8("radioButton_4"));
  178.   radioButton_4->setDown(false);
  179.   vboxLayout1->addWidget(radioButton_4);
  180.   Knob_2 = new QwtKnob(groupBox_2);
  181.   Knob_2->setGeometry(QRect(10, 76, 110, 110));
  182.   Knob_2->setObjectName(QString::fromUtf8("Knob_2"));
  183.   Knob_2->setOrientation(Qt::Horizontal);
  184.   Knob_2->setScaleDraw(draw);
  185.   Knob_2->setScale(0.0,10.0,1.0);
  186.   Knob_2->setScaleMaxMinor(0);
  187.   Knob_2->setRange(0.0,10.0,1.0);
  188.   Knob_2->setValue(8.0);
  189.   Knob_2->setFont(font);
  190.   hboxLayout->addWidget(groupBox_2);
  191.   groupBox_5 = new QGroupBox(centralwidget);
  192.   groupBox_5->setObjectName(QString::fromUtf8("groupBox_5"));
  193.   groupBox_5->setGeometry(QRect(860, 10, 130, 176));
  194.   groupBox_5->setAlignment(Qt::AlignHCenter);
  195.   label_6 = new QLabel(groupBox_5);
  196.   label_6->setObjectName(QString::fromUtf8("label_6"));
  197.   label_6->setGeometry(QRect(41, 20, 54, 15));
  198.   label_5 = new QLabel(groupBox_5);
  199.   label_5->setObjectName(QString::fromUtf8("label_5"));
  200.   label_5->setGeometry(QRect(45, 65, 41, 16));
  201.   wheel_3 = new QwtWheel(groupBox_5);
  202.   wheel_3->setObjectName(QString::fromUtf8("wheel_3"));
  203.   wheel_3->setGeometry(QRect(34, 36, 64, 24));
  204.   wheel_3->setOrientation(Qt::Horizontal);
  205.   wheel_3->setRange(-1.0,1.0,0.05);  
  206.   Knob_3 = new QwtKnob(groupBox_5);
  207.   Knob_3->setGeometry(QRect(12, 76, 110, 110));
  208.   Knob_3->setObjectName(QString::fromUtf8("Knob_3"));
  209.   Knob_3->setOrientation(Qt::Horizontal);
  210.   Knob_3->setScaleDraw(draw);
  211.   Knob_3->setScale(0.0,10.0,1.0);
  212.   Knob_3->setScaleMaxMinor(0);
  213.   Knob_3->setRange(0.0,10.0,1.0);
  214.   Knob_3->setValue(8.0);
  215.   Knob_3->setFont(font);
  216.   qwtPlot = new MyPlot(centralwidget);
  217.   qwtPlot->setObjectName(QString::fromUtf8("qwtPlot"));
  218.   qwtPlot->setGeometry(QRect(10, 10, 550, 360));
  219.   qwtPlot->setAutoReplot(false);
  220.   qwtPlot->setProperty("xBottomAxis", QVariant(false));
  221.   qwtPlot->setProperty("yLeftAxis", QVariant(false));
  222.   MainWindow->setCentralWidget(centralwidget);
  223.   menubar = new QMenuBar(MainWindow);
  224.   menubar->setObjectName(QString::fromUtf8("menubar"));
  225.   menubar->setGeometry(QRect(0, 0, 800, 27));
  226.   menu_H = new QMenu(menubar);
  227.   menu_H->setObjectName(QString::fromUtf8("menu_H"));
  228.   menu_F = new QMenu(menubar);
  229.   menu_F->setObjectName(QString::fromUtf8("menu_F"));
  230.   MainWindow->setMenuBar(menubar);
  231.   statusbar = new QStatusBar(MainWindow);
  232.   statusbar->setObjectName(QString::fromUtf8("statusbar"));
  233.   statusbar->setGeometry(QRect(0, 580, 800, 20));
  234.   MainWindow->setStatusBar(statusbar);
  235.   MainWindow->showMaximized();
  236.   menubar->addAction(menu_F->menuAction());
  237.   menubar->addAction(menu_H->menuAction());
  238.   menu_F->addAction(action_X);
  239.   menu_H->addAction(action_A);
  240.   menu_H->addAction(action_Q);
  241.   retranslateUi(MainWindow);
  242.   connect(action_X, SIGNAL(triggered()), this, SLOT(close()));
  243.   connect(wheel ,SIGNAL(valueChanged(double)),qwtPlot, SLOT(x_position(double)));
  244.   connect(wheel_2,SIGNAL(valueChanged(double)),qwtPlot,SLOT(y_position(double)));
  245.   connect(wheel_3,SIGNAL(valueChanged(double)),qwtPlot,SLOT(t_position(double)));
  246.   connect(Knob,SIGNAL(valueChanged(double)),qwtPlot,SLOT(x_scale(double)));
  247.   connect(Knob_2,SIGNAL(valueChanged(double)),qwtPlot,SLOT(y_scale(double)));
  248.   connect(Knob_3,SIGNAL(valueChanged(double)),qwtPlot,SLOT(t_scale(double)));
  249.   connect(radioButton_5,SIGNAL(clicked()),qwtPlot,SLOT(x_onclicked()));
  250.   connect(radioButton_2,SIGNAL(clicked()),qwtPlot,SLOT(x_offclicked()));
  251.   connect(radioButton ,SIGNAL(clicked()),qwtPlot,SLOT(x_zeroclicked()));
  252.   connect(radioButton_6,SIGNAL(clicked()),qwtPlot,SLOT(y_onclicked()));
  253.   connect(radioButton_3,SIGNAL(clicked()),qwtPlot,SLOT(y_offclicked()));
  254.   connect(radioButton_4,SIGNAL(clicked()),qwtPlot,SLOT(y_zeroclicked()));
  255.   connect(wheel ,SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  256.   connect(wheel_2,SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  257.   connect(wheel_3,SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  258.   connect(Knob, SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  259.   connect(Knob_2,SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  260.   connect(Knob_3,SIGNAL(valueChanged(double)),this,SIGNAL(situationChanged()));
  261.   connect(radioButton_5,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  262.   connect(radioButton_2,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  263.   connect(radioButton ,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  264.   connect(radioButton_6,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  265.   connect(radioButton_3,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  266.   connect(radioButton_4,SIGNAL(clicked()),this,SIGNAL(situationChanged()));
  267.   connect(this, SIGNAL(situationChanged()),qwtPlot,SLOT(setposition()));
  268.   QMetaObject::connectSlotsByName(MainWindow);
  269.   } // setupUi
  270.  
  271.   void retranslateUi(QMainWindow *MainWindow)
  272.   {
  273.   MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
  274.   action_X->setText(QApplication::translate("MainWindow", "E&xit", 0, QApplication::UnicodeUTF8));
  275.   action_A->setText(QApplication::translate("MainWindow", "&About", 0, QApplication::UnicodeUTF8));
  276.   action_Q->setText(QApplication::translate("MainWindow", "About &Qt", 0, QApplication::UnicodeUTF8));
  277.   groupBox->setTitle(QApplication::translate("MainWindow", "Channe1", 0, QApplication::UnicodeUTF8));
  278.   label->setText(QApplication::translate("MainWindow", "Position", 0, QApplication::UnicodeUTF8));
  279.   label_2->setText(QApplication::translate("MainWindow", "Scale/V", 0, QApplication::UnicodeUTF8));
  280.   groupBox_3->setTitle(QApplication::translate("MainWindow", "GroupBox", 0, QApplication::UnicodeUTF8));
  281.   radioButton_5->setText(QApplication::translate("MainWindow", "On", 0, QApplication::UnicodeUTF8));
  282.   radioButton_2->setText(QApplication::translate("MainWindow", "Off", 0, QApplication::UnicodeUTF8));
  283.   radioButton->setText(QApplication::translate("MainWindow", "Zero", 0, QApplication::UnicodeUTF8));
  284.   groupBox_2->setTitle(QApplication::translate("MainWindow", "Channel2", 0, QApplication::UnicodeUTF8));
  285.   label_3->setText(QApplication::translate("MainWindow", "Position", 0, QApplication::UnicodeUTF8));
  286.   label_4->setText(QApplication::translate("MainWindow", "Scale/V", 0, QApplication::UnicodeUTF8));
  287.   groupBox_4->setTitle(QApplication::translate("MainWindow", "GroupBox", 0, QApplication::UnicodeUTF8));
  288.   radioButton_6->setText(QApplication::translate("MainWindow", "On", 0, QApplication::UnicodeUTF8));
  289.   radioButton_3->setText(QApplication::translate("MainWindow", "Off", 0, QApplication::UnicodeUTF8));
  290.   radioButton_4->setText(QApplication::translate("MainWindow", "Zero", 0, QApplication::UnicodeUTF8));
  291.   groupBox_5->setTitle(QApplication::translate("MainWindow", "TimeBase", 0, QApplication::UnicodeUTF8));
  292.   label_6->setText(QApplication::translate("MainWindow", "Position", 0, QApplication::UnicodeUTF8));
  293.   label_5->setText(QApplication::translate("MainWindow", "Scale/s", 0, QApplication::UnicodeUTF8));
  294.   menu_H->setTitle(QApplication::translate("MainWindow", "&Help", 0, QApplication::UnicodeUTF8));
  295.   menu_F->setTitle(QApplication::translate("MainWindow", "&File", 0, QApplication::UnicodeUTF8));
  296.   } // retranslateUi
  297. };
  298.  
  299. namespace Ui {
  300.   class MainWindow: public Ui_MainWindow {};
  301. } // namespace Ui
  302. #endif // UNTITLED_H
[ 此贴被chwoozy在2006-05-28 20:39重新编辑 ]
离线chwoozy

只看该作者 1楼 发表于: 2006-05-28
很奇怪用下面这条语句的时候使编译出来的程序中的aboutQt菜单生效
  1. connect(action_Q, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

我已经到Linux下面去试了,结果还是一样,看来这个问题是平台无关的
离线浪漫天使
只看该作者 2楼 发表于: 2006-05-28
楼主,这两个头文件在那里??
#include "myplot.h"
#include "myscaledraw.h"

等你帖出来才能帮你看一下。
最好下次把自己的文件夹打包压缩一下,然后上传,不知道怎么做的话,看看其他的网友的做法,好吗?
离线chwoozy

只看该作者 3楼 发表于: 2006-05-28
我试过两种方法,按第一个方法我加了一行connect之后main.cpp是这个样子:
CODE: [Copy to clipboard]
  #include "ui_untitled.h"
  #include <QApplication>
  int main(int argc, char *argv[])
  {
    QApplication app(argc, argv);
    QMainWindow *window = new QMainWindow;
    Ui::MainWindow ui;
    ui.setupUi(window);
    window->show();
    connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));
    return app.exec();
  }
然后编译运行时报错“'connect' undeclared”
第二个方法就是将
  1. connect(action_X, SIGNAL(triggered()), this, SLOT(close()));

改为
  1. connect(action_X, SIGNAL(triggered()), qApp, SLOT(quit()));

一样无效,所以我很奇怪为什么类似于第二种方法写的一句使aboutQt生效的connect语句就能成功
离线chwoozy

只看该作者 4楼 发表于: 2006-05-28

楼主,这两个头文件在那里??
#include "myplot.h"
#include "myscaledraw.h"
等你帖出来才能帮你看一下。
最好下次把自己的文件夹打包压缩一下,然后上传,不知道怎么做的话,看看其他的网友的做法,好吗?

呵呵,遇到了热心人了啊。这两个文件我认为是与界面关系不大的,不过你要我可以给你。
但是我的这个项目涉及到一个叫Qwt的库,我觉得可能别人自己想试的时候看到还要自己去准备这么多东西可能就不会来帮我了:)。我用的Qwt库源文件压缩后都比500K大,再加上是教育网,连接到这个论坛比较慢,所以希望感兴趣的朋友到这里去下载:http://sourceforge.net/project/showfiles.php?group_id=13693&package_id=161312
里面有安装说明的

附件里面是这个项目所有的文件了。由于我把Qwt的所有头文件都拷到/include/QtCore文件夹下,所以include里面的文件可能找不着,只好麻烦各位自己动手改一下了
[ 此贴被chwoozy在2006-05-28 23:20重新编辑 ]
附件: Third.rar (6 K) 下载次数:4
离线浪漫天使
只看该作者 5楼 发表于: 2006-05-28
好了,主要改了这里,

connect(action_X, SIGNAL(triggered()), MainWindow, SLOT(close()));

把this参数换成了MainWindow,就是setupUi时候传进来的参数。
qt4是这样的了

还有把相应的头文件屏蔽了
在windows2000 qt4.1.0开源版调试通过,运行ok;
描述:qteit
附件: qtexit.rar (36 K) 下载次数:6
离线浪漫天使
只看该作者 6楼 发表于: 2006-05-28
引用第3楼chwoozy2006-05-28 23:06发表的“”:
我试过两种方法,按第一个方法我加了一行connect之后main.cpp是这个样子:
CODE: [Copy to clipboard]
  #include "ui_untitled.h"
  #include <QApplication>
  int main(int argc, char *argv[])
.......




试一下 app.connect(…………);
离线chwoozy

只看该作者 7楼 发表于: 2006-05-29

connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));

改了这个不行。我还是试试你5楼的方法吧
离线chwoozy

只看该作者 8楼 发表于: 2006-05-29
  1. connect(action_X, SIGNAL(triggered()), MainWindow, SLOT(close()));

我用了这句就好了,谢谢了
离线downstairs

只看该作者 9楼 发表于: 2011-02-25
···。。。老帖子了
喜爱编程的猫头鹰
快速回复
限100 字节
 
上一个 下一个