我只有一个问题:如果您正在编译某些代码以了解GUI标志是否已设置,那么可以使用定义(或类似的东西)吗?
我会更好地解释.我想在QT中为不同的程序重用一些代码.现在,此代码的某些部分仅用于GUI应用程序(或更好的窗口小部件应用程序),并依赖于QtGui和QtWidgets.我想将这些部分放在条件块(#if或#ifdef)中,以便仅在包含GUI和/或小部件库的项目中进行编译.
并且,在您提出建议之前,制作库不是解决方案.我更喜欢定义......
编辑:
可能我没有清楚地解释自己.我正在寻找的是与GUI包含相关的定义.例:
FILE myfile.h
#ifdef THE_QT_GUI_DEFINE_FLAG
#include <QPainter.h>
#endif
Run Code Online (Sandbox Code Playgroud)
PROJECT A:在我写的QMake文件中:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
Run Code Online (Sandbox Code Playgroud)
项目B:在我写的QMake文件中:
QT -= gui
Run Code Online (Sandbox Code Playgroud)
现在,我希望QPainter.h将其包含在项目A中.您是否知道在添加gui库时设置的define标志是什么?我试过QT_QTGUI_MODULE_H,但它不起作用(可能是因为它只是在你编译THE qt库时使用).
我有一个QT库,我想在另一个项目中导入它.
现在,既然我想要,即使我修改了库,另一个项目也不需要再次编译,我开始使用QLibrary.
但是......我无法导入课程.或者更好,我可以导入该类,但我无法访问其方法.
这是我做的例子.
这是类声明:
class TESTDLL_LIBSHARED_EXPORT TestDLL_lib
{
public:
TestDLL_lib();
int a;
int b;
int c;
int getValues();
};
Run Code Online (Sandbox Code Playgroud)
这个实施:
#include "testdll_lib.h"
TestDLL_lib::TestDLL_lib()
{
a = 10;
b = 20;
c = 30;
}
int TestDLL_lib::getValues()
{
return a+b+c;
}
extern "C" TESTDLL_LIBSHARED_EXPORT TestDLL_lib* create_TestDLL_lib()
{
return new TestDLL_lib();
}
Run Code Online (Sandbox Code Playgroud)
虽然这是主文件,但在另一个项目中:
#include <testdll_lib.h>
#include <QDebug>
#include <QLibrary>
int main(int argc, char *argv[])
{
QLibrary library("TestDLL_lib");
if (library.load())
{
typedef TestDLL_lib* (*create_TestDLL_lib_fun)();
create_TestDLL_lib_fun create_TestDLL_lib = (create_TestDLL_lib_fun)library.resolve("create_TestDLL_lib");
if (create_TestDLL_lib)
{
TestDLL_lib …Run Code Online (Sandbox Code Playgroud) 我正在使用QT 5.7,并且由于必须使用库,因此需要将QObject(派生类)与void指针进行相互转换。
几个定义。我有一个仅接受空指针的函数,而我的类是从QObject派生的:
void oneFunction(void *obj);
class MyObj : public QObject
{
...
};
Run Code Online (Sandbox Code Playgroud)
然后创建并填充一个对象:
MyObj *ptr = new MyObj(parent);
ptr->.......
Run Code Online (Sandbox Code Playgroud)
在某些时候,我将其转换为void指针,因为我必须将其传递给函数。该转换是自动完成的:
oneFunction(ptr);
Run Code Online (Sandbox Code Playgroud)
然后,一段时间后,我收到了我传递的指针,并且需要将其转换回原始类。指针未被函数修改:
void callbackFromOneFunction(void *theOldPointer)
{
MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
if (oldPtr != nullptr)
{
... Now it's back, so use it
}
}
Run Code Online (Sandbox Code Playgroud)
现在,整个过程对吗?您发现一些问题/泄漏吗?有更好的解决方案吗?
谢谢
我在 QT 布局方面遇到了一个小问题。
我有一个工具箱,我想用一些带有描述的可检查按钮填充它。所以我用QWidgeta创建一个QGridLayout并将 放在QButton第一个单元格中,将QLabel放在第二个单元格中。
这是代码中最重要的部分(我删除了应用程序中其他不相关代码的依赖项):
QWidget *createCellWidget()
{
QToolButton *button = new QToolButton(this);
button->setCheckable(true);
button->setMinimumSize(57,57);
button->setMaximumSize(57,57);
QWidget *widget = new QWidget(this);
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(button, 0, 0, Qt::AlignHCenter);
QLabel *lbl = new QLabel("my very long caption");
lbl->setWordWrap(true);
lbl->setAlignment(Qt::AlignCenter);
layout->addWidget(lbl, 1, 0, Qt::AlignTop);
widget->setMaximumWidth(80);
widget->setMinimumWidth(80);
return widget;
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个QGridLayout并用这些控件填充它:
QWidget *itemWidget_FlowControl = new QWidget(this);
QGridLayout *_flowControl_layout = new QGridLayout(itemWidget_FlowControl);
_flowControl_layout->addWidget(createCellWidget(), 0, 0);
Run Code Online (Sandbox Code Playgroud)
这运行良好并产生以下输出:

这是一个不错的布局。不幸的是,如果我放大窗口,控件不会“流动”,所以我尝试用 flowlayout 替换 QGridLayout ( …
我有4个SingleTact电容式传感器,每个传感器的i2c地址为0x04.我想找到传感器的平均值,以制作操纵杆.但是我不确定如何为每个传感器分配它自己的地址,因为它们都具有相同的地址,因为它们是相同的传感器.我有一个初始代码,但这只适用于一个传感器,因为它只有一个i2c地址字节.我已经使用在线教程将所有SDA和SCL线连接在一起,并包含了上拉电阻.
#include <Wire.h>
#define initializetime 4
byte serialToPCBuffer[77];
byte serialToPCBufferIndex = 0;
int data[4];
int databuffer[4][initializetime] = {0,0,0,0,0,0,0,0,0,0,0,0};
int base[4] = {0,0,0,0};
int ArduinoToPCBuffer[4] = {1000,2000,3000,4000};
byte outgoingI2CBuffer[32];
unsigned long timeStamp_;
void setup() {
int i;
Wire.begin();
//TWBR = 12;
Serial.begin(57600);
Serial.flush();
initializeSensors();
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("PPS UK: SingleTact sensor value in PSI. \n(resembles PC executable display)");
Serial.println("Refer manual for any other calculation.");
Serial.println("----------------------------------------");
} …Run Code Online (Sandbox Code Playgroud) 最初这必须是另一个问题的最后一段(这一个),但我注意到主题不是那么相似,因此我想发布另一个问题.
我想要完成的是制作一个自动化系统,以简单的方式编译一些动作.
例如,而不是写作
switch (var)
{
case SM_1:
printf("Case 1");
break;
case SM_2:
printf("Case 2");
break;
case SM_3:
printf("Case 3");
break;
}
Run Code Online (Sandbox Code Playgroud)
我会更容易写出类似的东西
#define CASES
#define CreateCaseX(s,l) CASES += \
case s: \
printf(l); \
break;
CreateCaseX(SM_1, "Case 1")
CreateCaseX(SM_2, "Case 2")
CreateCaseX(SM_3, "Case 3")
...
switch(var)
{
CASES
}
Run Code Online (Sandbox Code Playgroud)
我不希望该CASES +=语句实际工作,但是......是否有一些类似的构造我可以在预处理器中使用一些动作(函数调用,切换案例......)添加到列表然后让它们写入它们一次全部?
编辑:我认为我已经很好地解决了我的问题边界,但是看一些答案和评论我注意到这个问题可以用不同的方式解释.所以请原谅我,现在我会尝试更好地详细说明.
我正在写一个简单的状态机.每当我添加状态时,我都必须执行不同的代码修改,例如
例如,我可以在我的文件中包含以下行:
enum {
SM_Case_1,
SM_Case_2,
SM_Case_3
} currentState;
void printState()
{
switch (currentState)
{
case SM_Case_1:
printf("State 1"); …Run Code Online (Sandbox Code Playgroud)