在qt 4.8.6中打开模态窗口

时间:2014-04-30 05:55:18

标签: c++ qt

我正在开发一个安装哇插件的简单程序,需要一些帮助才能让主窗口打开一个首选项窗口。我对Qt很新,并且对文档有点挣扎。我做了一些关于stackoverflow的事情,但仍然有点困在正确的区域。

编辑:添加错误信息。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();

private:
  Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

preferences.h

#ifndef PREFERENCES_H
#define PREFERENCES_H

#include <QDialog>

namespace Ui {
class Preferences;
}

class Preferences : public QDialog
{
Q_OBJECT

public:
   explicit Preferences(QWidget *parent = 0);
   ~Preferences();

private:
   Ui::Preferences *ui;
};

#endif // PREFERENCES_H

的main.cpp

#include "mainwindow.h"
#include "preferences.h"
#include <QApplication>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   w.show();

   return a.exec();
}


void MainWindow::on_Preferences_triggered()
{
   Preferences = new PreferencesDialog(this);
   Preferences->show();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "preferences.h"
#include <QtGui/QDialog>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
  ui->setupUi(this);
}

MainWindow::~MainWindow()
{
  delete ui;
}

preferences.cpp

#include "preferences.h"
#include "ui_preferences.h"

Preferences::Preferences(QWidget *parent) :
QDialog(parent),
ui(new Ui::Preferences)
{
  ui->setupUi(this);
}

Preferences::~Preferences()
{
  delete ui;
}

收到错误     错误:no'void MainWindow :: on_Preferences_triggered()'     在'MainWindow'类中声明的成员函数

我将mainwindow.ui文件放在pastebin上,因为添加了工具提示,因为它在这里乱七八糟。

http://pastebin.com/ZXrDxZXz

1 个答案:

答案 0 :(得分:0)

通常,如果您希望对话框是模态的,请使用QDialog :: exec()。如果需要无模式对话框,请使用QDialog :: show()。您可以通过将modal属性设置为true来使用show()来显示模式对话框。

我修复了你的代码,以便编译和运行。首先,你得到的编译器错误就是它所说的:你已经实现了一个你未在类定义中声明的函数MainWindow :: on_Preferences_triggered()。但还有一些其他问题。我将从main.cpp文件开始:

#include "mainwindow.h"
#include "preferences.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MainWindow w;
  w.resize(200,200);
  w.show();

  return a.exec();
}


/* Move this to mainwindow.cpp
void MainWindow::on_Preferences_triggered()
{
  Preferences = new PreferencesDialog(this);
  Preferences->show();
}*/

我注释掉了on_Preferences_triggered函数,因为它应该被移动到mainwindow.cpp文件中,其中实现了MainWindow类的其余部分。我还调整了你在main()函数中创建的MainWindow实例的大小。

打开到mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "preferences.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

private:
  /* add a function to set up a menubar/menu (you could do this in the constructor instead) */

  void setupMenus();


  /* Your main window doesn't need an instance of Ui::MainWindow, it IS an instance*/
  //Ui::MainWindow *ui;

  /* It needs a Preferences instance, though */
  Preferences *pref;


private slots:
  void on_Preferences_triggered();


};

#endif // MAINWINDOW_H

首先,在Preferences和MainWindow定义中,分别有Preferences和MainWindow实例。我不确定你为什么这样做,但我不认为这是你想要的。 MainWindow需要一个Preferences实例(我已添加),但我不认为任何一个类需要自己的实例。

接下来,我将你的on_Preferences_triggered()函数添加为一个插槽。你需要这个。最后,我添加了一个setupMenus()函数,它设置了菜单栏,但如果你愿意,可以在构造函数中执行此操作。

mainwindow.cpp:

#include "mainwindow.h"
//#include "ui_mainwindow.h"

/* Move this to mainwindow.h */
//#include "preferences.h"
#include <QtGui/QDialog>
#include <QMenuBar>
#include <QAction>
#include <QMenu>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
//ui(new Ui::MainWindow)
{
  //ui->setupUi(this);

  /* initialize your preferences window */
  pref = new Preferences(this);

  /* add a menubar with a menu that will allow you to open the preferences windwow */
  setupMenus();

  /* You need a central widget: */
  setCentralWidget(new QLabel("Central widget", this));

}

MainWindow::~MainWindow()
{
  //delete ui;

  /* You can explicitly delete the Preferences pointer, but Qt will take care of it, since its parent is this  */
}

void MainWindow::setupMenus()
{
  QMenu *menu = menuBar()->addMenu(tr("&Menu"));
  QAction *prefAction = new QAction("Show preferences", this);

  /* Crucial: connect the action's triggered signal to your on_Preferences_triggered slot */
  connect(prefAction, SIGNAL(triggered()), this, SLOT(on_Preferences_triggered()));

  menu->addAction(prefAction);
}

void MainWindow::on_Preferences_triggered()
{
  /*Preferences = new PreferencesDialog(this);
  Preferences->show();*/
  pref->show();
  pref->setModal(true);
}

根据文档,不支持没有中央窗口小部件的QMainWindow ...所以我添加了一个QLabel作为占位符。构造函数的其余部分非常明显......分配您的Preferences指针,调用setupMenus。

setupMenus功能完成了重要的工作。菜单栏是在您第一次调用menuBar()时创建的,所以我调用它并添加了一个菜单。然后我创建了一个QAction,用于显示您的首选项对话框。为此,您需要将操作的triggered()信号连接到on_Preferences_triggered()插槽。

on_Preferences_triggered()插槽几乎就是你所拥有的,除了它没有创建一个Preferences实例(它可以......你可以保留你拥有的)。这里有一个重点:我使用pref-&gt; show()弹出对话框,然后使用pref-&gt; setModal(true)进行模态化。你可以使用pref-&gt; exec()。但请阅读Kuba Ober的评论。

然后,在preferences.h中:

#ifndef PREFERENCES_H
#define PREFERENCES_H

#include <QDialog>

namespace Ui {
class Preferences;
}

class Preferences : public QDialog
{
Q_OBJECT

public:
  explicit Preferences(QWidget *parent = 0);
  ~Preferences();

private:
  void setupDialog();

  /* Preferences doesn't need an instance of Preferences */
  //Ui::Preferences *ui;
};

#endif // PREFERENCES_H

我添加了一个setupDialog()函数,并再次删除了Preferences的实例,因为我觉得你不需要它。

和preferences.cpp:

#include "preferences.h"
//#include "ui_preferences.h"

#include <QVBoxLayout>
#include <QLabel>

Preferences::Preferences(QWidget *parent) :
QDialog(parent)
//ui(new Ui::Preferences)
{
  //ui->setupUi(this);
  setupDialog();

}

Preferences::~Preferences()
{
  //delete ui;
}

void Preferences::setupDialog()
{
  QVBoxLayout *layout = new QVBoxLayout(this);

  layout->addWidget(new QLabel("Preferences Dialog"));
}

我刚刚在setupDialog函数中创建了一个带有虚拟QLabel的虚拟布局。

另外......我评论了你的#include&#34; ui_preferences.h&#34;和&#34; ui_mainwindow.h&#34;声明,因为您没有包含此代码。不确定你在这些标题中做了什么,或者它们是否重要。