前两次编译失败,失败原因知识点补充如下:
1、endl
在C++中,std::endl
是一个流操控符,用于在输出流中插入换行符,并刷新输出缓冲区。它通常与std::cout
一起使用,但在Qt中,qDebug()
也可以使用。
基本用法
1.1、 使用 std::endl
和 std::cout
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl; // 输出: Hello, World!
return 0;
}
在这个例子中,std::endl
会在输出后插入一个换行符,并刷新输出缓冲区。
1.2、 在 Qt 中使用 qDebug()
在Qt中,虽然qDebug()
本身会自动在输出末尾添加换行符,但如果你想要在qDebug()
的输出中使用std::endl
,你可以这样做:
QT6.7验证失败,如下报编译错误,std下已无endl;
#include <QDebug>
int main() {
qDebug() << "Hello, Qt!" << std::endl; // 输出: Hello, Qt!
return 0;
}
注意事项
-
性能:每次使用
std::endl
都会刷新输出缓冲区,这可能会影响性能。如果不需要立即刷新缓冲区,可以使用换行符\n
代替,例如:std::cout << "Hello, World!" << "\n"; // 不会刷新缓冲区
-
在Qt中使用:对于
qDebug()
,通常不需要使用std::endl
,因为它已经自动处理换行。
编译异常原因一,此处加了endl
2、qDebug
在Qt中,qDebug
是一个用于打印调试信息的函数,它提供了一种方便的方式来输出文本、变量值和其他信息到控制台或调试器。qDebug
是Qt的日志系统的一部分,通常用于开发和调试阶段。
基本用法
qDebug
的基本用法非常简单,可以直接调用并传入你想要输出的内容。它支持多种数据类型,包括字符串、整数、浮点数、对象等。
2.1、 输出基本信息
#include <QDebug>
int main() {
qDebug() << "Hello, Qt!"; // 输出: Hello, Qt!
return 0;
}
2.2、 输出变量
#include <QDebug>
int main() {
int value = 42;
QString name = "Qt";
qDebug() << "Value:" << value; // 输出: Value: 42
qDebug() << "Name:" << name; // 输出: Name: "Qt"
return 0;
}
2.3、 输出多个变量
你可以在一个qDebug
调用中输出多个变量,使用<<
运算符连接它们。
#include <QDebug>
int main() {
int x = 10;
int y = 20;
qDebug() << "Coordinates:" << x << y; // 输出: Coordinates: 10 20
return 0;
}
2.4、 输出格式化字符串
你可以使用QString
的arg
方法来格式化输出。
#include <QDebug>
#include <QString>
int main() {
int count = 5;
QString message = QString("There are %1 items.").arg(count);
qDebug() << message; // 输出: There are 5 items.
return 0;
}
使用qDebug
的注意事项
-
调试信息的级别:
qDebug
是用于调试的输出,通常在生产环境中不建议使用。Qt还提供了其他日志函数,如qWarning
,qCritical
,qFatal
等,用于不同级别的日志输出。 -
性能:在性能敏感的代码中,频繁使用
qDebug
可能会影响性能。可以使用条件编译来控制调试输出。 -
输出到文件:可以通过重定向Qt的消息输出,将日志信息输出到文件中。
输出到文件示例
如果需要将qDebug
的输出重定向到文件,可以使用QFile
和QTextStream
:
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QTextStream>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QFile file("debug.log");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
qInstallMessageHandler([&out](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
out << msg << "\n";
out.flush();
});
}
qDebug() << "This will be logged to the file.";
return a.exec();
}
QDialogButtonBox
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDialogButtonBox>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QDialogButtonBox *dialogButtonBox;
QPushButton *pushButton;
private slots:
/*声明信号槽,带QAbstractButton *参数,用于判断点击了哪个按钮*/
void dialogButtonBoxClicked(QAbstractButton *);
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this -> setGeometry(0,0,800,480);
/*实例化并设置按钮的盒子的大小和位置*/
dialogButtonBox = new QDialogButtonBox(this);
dialogButtonBox -> setGeometry(300,200,200,30);
/*使用Qt的Cancel按钮*/
dialogButtonBox -> addButton(QDialogButtonBox::Cancel);
/*将英文Cancel按钮设置为中文“取消”*/
dialogButtonBox -> button(QDialogButtonBox::Cancel)-> setText("取消");
/*设置位置与大小*/
pushButton = new QPushButton(tr("自定义"));
/*将PushButton添加到dialogButtonBox,并设定ButtonRole为ActionRole */
dialogButtonBox -> addButton(pushButton,QDialogButtonBox::ActionRole);
/*信号槽连接,带参数QAbstractButton *,用于判断用户点击哪个按键*/
connect(dialogButtonBox,SIGNAL(clicked(QAbstractButton*)),
this,SLOT(dialogButtonBoxClicked(QAbstractButton*)));
}
MainWindow::~MainWindow() {}
void MainWindow::dialogButtonBoxClicked(QAbstractButton *button)
{
/*判断点击对象是否为QAbstractButton::Cancel*/
if(button == dialogButtonBox->button(QDialogButtonBox::Cancel)){
/*打印“单击了取消键”*/
qDebug() << "单击了取消键";
/*判断点击的对象是否为pushButton*/
}else if(button == pushButton){
/*打印“单击了自定义键”*/
qDebug() << "单击了自定义键";
}
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
运行结果: