小编fra*_*i87的帖子

Qt gui是否有定义?

我只有一个问题:如果您正在编译某些代码以了解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库时使用).

c++ qt c-preprocessor

11
推荐指数
1
解决办法
2049
查看次数

QLibrary - 导入一个类

我有一个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)

c++ qt qlibrary qt5

5
推荐指数
1
解决办法
4673
查看次数

在QObject *和void *之间转换

我正在使用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)

现在,整个过程对吗?您发现一些问题/泄漏吗?有更好的解决方案吗?

谢谢

c++ qt pointers casting

3
推荐指数
1
解决办法
1114
查看次数

QT Flowlayout - 多行标签问题

我在 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 ( …

qt flowlayout

2
推荐指数
1
解决办法
1562
查看次数

从具有相同地址的i2c传感器读取值

我有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)

arduino i2c

2
推荐指数
1
解决办法
1063
查看次数

预处理器中的命令串联

最初这必须是另一个问题的最后一段(这一个),但我注意到主题不是那么相似,因此我想发布另一个问题.

我想要完成的是制作一个自动化系统,以简单的方式编译一些动作.

例如,而不是写作

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 +=语句实际工作,但是......是否有一些类似的构造我可以在预处理器中使用一些动作(函数调用,切换案例......)添加到列表然后让它们写入它们一次全部?

编辑:我认为我已经很好地解决了我的问题边界,但是看一些答案和评论我注意到这个问题可以用不同的方式解释.所以请原谅我,现在我会尝试更好地详细说明.

我正在写一个简单的状态机.每当我添加状态时,我都必须执行不同的代码修改,例如

  • 将状态添加到枚举中
  • 在switch case结构中添加状态名称,该结构返回当前状态的名称
  • 添加当该状态为当前状态时要执行的操作

例如,我可以在我的文件中包含以下行:

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)

c c++ c-preprocessor

2
推荐指数
1
解决办法
85
查看次数

标签 统计

c++ ×4

qt ×4

c-preprocessor ×2

arduino ×1

c ×1

casting ×1

flowlayout ×1

i2c ×1

pointers ×1

qlibrary ×1

qt5 ×1