将子类与Qt一起使用
Using Subclass With Qt
我想用消息对话框实现一个"退出"应用程序。我将"记事本"定义为Qwidget的一个子类。然后,我定义了一个"退出"方法。
我的代码:
#include <QtWidgets/QApplication>
#include <QTextEdit>
#include <QtGui>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QPushButton>
class Notepad : public QWidget
{
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
Notepad::Notepad()
{
textEdit = new QTextEdit;
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
void Notepad::quit()
{
QMessageBox messageBox;
messageBox.setWindowTitle(tr("Notepad"));
messageBox.setText(tr("Do you really want to quit?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::No);
if (messageBox.exec() == QMessageBox::Yes)
qApp->quit();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Notepad k;
return a.exec();
}
错误:
1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Notepad::metaObject(void)const " (?metaObject@Notepad@@UEBAPEBUQMetaObject@@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Notepad::qt_metacast(char const *)" (?qt_metacast@Notepad@@UEAAPEAXPEBD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Notepad::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Notepad@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Notepad::staticMetaObject" (?staticMetaObject@Notepad@@2UQMetaObject@@B)
我不明白问题出在哪里。
这只是Qt的奇怪行为。不应该在main.cpp中放置任何类定义。所以只需要单独的代码:
记事本.h
#include <QTextEdit>
#include <QtGui>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QPushButton>
class Notepad : public QWidget
{
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
记事本.cpp
#include "Notepad.h"
Notepad::Notepad()
{
textEdit = new QTextEdit;
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
void Notepad::quit()
{
QMessageBox messageBox;
messageBox.setWindowTitle(tr("Notepad"));
messageBox.setText(tr("Do you really want to quit?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::No);
if (messageBox.exec() == QMessageBox::Yes)
qApp->quit();
}
和main.cpp
#include <QtWidgets/QApplication>
#include "Notepad.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Notepad k;
k.show(); //Also you forgot this line. Without this it just invisible app will be
return a.exec();
}
如果您想使用QObject的Signal Slot机制,您必须在头文件中声明您的类,以允许moc对其进行预处理。
相关文章:
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将Qt与Visual Studio Code(Windows)一起使用
- 模拟GPS数据,以便使用Qt与Traccar一起使用
- 将 tensorflow lite 与 Qt 一起使用
- 无法将DefineClass(JNI)与Qt资源一起使用
- 如何将Valgrind与Qt Creator一起使用来调试远程应用程序?
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 将C++数据模型与Qt SCXML状态机一起使用
- 如何在Qt TableView中将列的宽度调整为数据并将最后一部分拉伸在一起
- CppUnit 测试与 Qt 5.9 一起挂起
- 如何将SQLite与Qt一起使用
- 当将QT创建者与CMAKE一起使用时,为什么我不必手动链接MSVC库
- 在将QT与Cmake一起使用时解决链接错误
- 如何将HTTPS与Qt网络一起使用
- 将FreeImage与Qt一起使用
- 如何使用Opencv,qt creator,ming gw窗口在一起
- 将QT与Boehm-Demers-Weiser-GC一起使用
- 如何让我的C++代码与QT按钮一起使用并打印到QlineEdit?
- 将UWP API与QT一起使用
- QT项目在配置文件上崩溃,与发布和调试器一起运行