我正在开发一个安装哇插件的简单程序,需要一些帮助才能让主窗口打开一个首选项窗口。我对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上,因为添加了工具提示,因为它在这里乱七八糟。
答案 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;声明,因为您没有包含此代码。不确定你在这些标题中做了什么,或者它们是否重要。