小编Ven*_*nom的帖子

Qt - 具有枚举类类型的Q_DECLARE_METATYPE()

有没有办法将Q_DECLARE_METATYPE()与枚举类类型一起使用?我知道旧的枚举工作,但这些新的,强类型的?其他地方找不到关于这个问题的任何事情 我正在使用最新的Qt版本.

例:

enum Foo
{
    A,
    B,
    C
};

Q_DECLARE_METATYPE(Foo)
QVariant var = Foo::A; // works fine

enum class Bar
{
    X,
    Y,
    Z
};

Q_DECLARE_METATYPE(Bar)
QVariant var = Bar::X; // doesn't compile
Run Code Online (Sandbox Code Playgroud)

c++ qt enum-class

15
推荐指数
2
解决办法
9200
查看次数

Logback - 在启动时删除日志文件

我想在每次启动程序时删除日志文件,而不是追加它.我尝试过使用cleanHistoryOnStart属性,但这似乎没有任何效果.我可能在这里遗漏了一些东西.

如果重要的话,我在Linux上使用Eclipse.

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="10 seconds">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{dd.MM.yyyy. HH:mm:ss} %level [%thread] %logger{20} - %msg%n</pattern>
    </encoder>
  </appender>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>chat.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>chat.log.%d{yyyy-MM-dd}</fileNamePattern>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
    <encoder>
      <pattern>%d{dd.MM.yyyy. HH:mm:ss} %level [%thread] %logger{20} - %msg%n</pattern>
    </encoder>
    <Encoding>utf-8</Encoding>
  </appender>
  <logger name="src" additivity="false" level="ALL">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </logger>
  <root level="OFF">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>
Run Code Online (Sandbox Code Playgroud)

java logback

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

通过对基类的引用来调用虚函数

当我运行它时,此代码拒绝将适当的消息打印到控制台.使用指针而不是引用似乎工作( - >而不是.).我是OOP的新手,请原谅我,如果你觉得这太荒谬了.

#include <iostream>

using namespace std;

class instrument {
public:
    virtual void play(){}
};

class drum : public instrument {
public:
    void play(){
        cout << "dum, dum" << endl;
    }
};

class piano : public instrument {
public:
    void play(){
        cout << "pling" << endl;
    }
};

int main (){
    instrument i;
    piano p;
    drum d;

    instrument &pi = i;
    pi.play();  // -

    pi = p;
    pi.play();  // pling

    pi = d;
    pi.play();  // dum, dum
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance reference

7
推荐指数
1
解决办法
9766
查看次数

Qt QGridLayout - 删除项目间距

我正在尝试在Qt中编写战舰的实现,我正在使用两个QGridLayouts来包含用于表示玩家网格的QToolButtons.顶级布局(QMainWindows one)是QHBoxLayout.我想要完成的是删除这些按钮之间的间距.这就是它当下的样子:

格

它绝对不漂亮.我在这些布局中添加项目,如下所示:

QIcon icon;
icon.addFile(QStringLiteral(":/images/Resources/field_blue.png"), QSize(), QIcon::Normal, QIcon::Off);
for (int i = 0; i < dimensions; ++i)
{
    for (int j = 0; j < dimensions; ++j)
    {
        QToolButton* buttonLeft = new QToolButton(this);
        buttonLeft->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        buttonLeft->setText(QString::number(i) + "-" + QString::number(j));
        buttonLeft->setFixedSize(FIELD_ICON_SIZE + 10, FIELD_ICON_SIZE + 10); // FIELD_ICON_SIZE -> 20
        buttonLeft->setIcon(icon);
        buttonLeft->setIconSize(QSize(FIELD_ICON_SIZE, FIELD_ICON_SIZE));
        buttonLeft->setAutoRaise(true);
        QToolButton* buttonRight = new QToolButton(this);
        buttonRight->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        buttonRight->setText(QString::number(i) + "-" + QString::number(j));
        buttonRight->setFixedSize(FIELD_ICON_SIZE + 10, FIELD_ICON_SIZE + 10);
        buttonRight->setIcon(icon);
        buttonRight->setIconSize(QSize(FIELD_ICON_SIZE, FIELD_ICON_SIZE));
        buttonRight->setAutoRaise(true);
        _ui.gridLayoutLeft->addWidget(buttonLeft, i, j);
        _ui.gridLayoutRight->addWidget(buttonRight, i, …
Run Code Online (Sandbox Code Playgroud)

c++ qt

6
推荐指数
1
解决办法
1714
查看次数

C++ - 重载赋值运算符内存泄漏

我有一个类方法,它与一个对象的副本一起工作(确切地说是*).泄漏发生在重载的赋值运算符中 - 无论如何,这就是Visual Leak Detector所说的.我正在做的是使用副本,如果完成的工作是令人满意的,我将新创建的对象复制回来.我还实现了自定义析构函数,复制构造函数和赋值运算符,因为问题出现在动态分配的内存中.我使用C++的经验非常有限,因此代码中可能存在一些恶意内容.

如果需要,我会提供更多信息.

问题方法:

bool Grid::SurroundShipSquares(int top, int bottom, int left, int right)
{
    // copying itself
    Grid gridCopy(*this);
    Square** squaresCopy = gridCopy.GetSquares();
    for (int i = top; i <= bottom; ++i)
    {
        for (int j = left; j <= right; ++j)
        {
            if (squaresCopy[i][j].GetState() != SquareState::Vacant)
                return false;
            (squaresCopy[i][j]).SetState(SquareState::Unoccupiable);
        }
    }
    // the problem occurs here
    *this = gridCopy;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

复制构造函数:

Grid::Grid(const Grid& source)
{
    _position = source._position;
    _size = source._size;
    int dimensions = …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks operator-overloading copy-constructor assignment-operator

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

Qt - 坐标处的QGridLayout访问元素

我有一个QGridLayout,其中包含常量的行和列,其中包含QToolButton的实例.我想要做的是访问此布局中的对象,其位置由其坐标确定.我知道有QGridLayout :: - > itemAtPosition(row,column)返回一个指向QLayoutItem的指针,但是一旦我将它转换为QToolButton(很明显),并尝试更改其中的内容我得到访问冲突异常.

这就是我试图将QLayoutItem*转换为QToolButton*的方法:

QToolButton* button = dynamic_cast<QToolButton*>(_ui.gridLayoutLeft->itemAtPosition(x, y)); // gridLayoutLeft is of type QGridLayout*
Run Code Online (Sandbox Code Playgroud)

static_cast给了我一个"无效的类型转换"错误.可以做些什么来实现这种行为?

我正在使用VS 2013和最新的Qt.

c++ qt

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

不会调用Global.asax的Application_Start方法

我有一个托管在我的本地IIS(而不是Express)上的WCF Web服务.我在其根目录中包含了一个Global.asax,它应该在那里.由于我使用Ninject与WCF扩展,类全球扩展,而不是一个HttpApplication NinjectHttpApplication(如看到这里).另外,我正在使用AutoMapper库来规避编写无聊的样板代码.出现这个问题的原因是我没有调用我为配置AutoMapper定义的静态方法,导致AutoMapper在调用Mapper.Map()时抛出异常.静态方法的调用是在Global.asax的Application_Start()方法中定义的,因为我希望每个Web服务的生命周期执行一次这些映射.顺便说一句,Ninject的CreateKernel()方法被调用就好了.我在这里错过了什么吗?我已经尝试过调试它,即使我已经将调试器附加到w3wp.exe并尝试在其正文中调用一个显式的Debugger.Break()调试,它也没有达到断点.

到目前为止它是这样的:

Global.asax中

<%@ Application Codebehind="Global.asax.cs" Inherits="MyApp.WebHost.Global" Language="C#" %>
Run Code Online (Sandbox Code Playgroud)

的Global.asax.cs

public class Global : NinjectHttpApplication
{
    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel();

        /* various bindings */

        return kernel;
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        AutoMapperConfig.RegisterMappings();
    }
    /* rest of Global.asax methods (Session_Start, Application_BeginRequest, etc.) with empty bodies */
Run Code Online (Sandbox Code Playgroud)

RegisterMappings方法

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        /* multiple calls to Mapper.CreateMap() */

        Mapper.AssertConfigurationIsValid();
    }
}
Run Code Online (Sandbox Code Playgroud)

Svc文件标记

<%@ …
Run Code Online (Sandbox Code Playgroud)

wcf ninject automapper global-asax

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

WPF ItemsControl Button命令绑定不起作用

我有一个ItemsControl控件,它有一个ObservableCollection作为其ItemsSource.它还有一个位于DataTemplate内部的按钮.按钮的Command属性绑定到ViewModel中的RelayCommand(我使用的是MVVM Light),CommandParameter绑定到ItemsSource中的相应项.
问题是由于某种原因,命令永远不会触发.另一方面,代码隐藏工作正常.调试鼠标单击事件处理程序时,我可以看到发送方(类型为Button)的CommandParameter填充了正确的数据,而Command为null.

我在这里想念的是什么?

XAML:

<ItemsControl ItemsSource="{Binding Users}"
              Margin="{StaticResource ContentMargin}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Margin="{StaticResource ImageButtonMargin}"
                    Style="{StaticResource ImageButtonStyle}"
                    Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.UserSelectedCommand}"
                    CommandParameter="{Binding}">
                    <!--...-->
Run Code Online (Sandbox Code Playgroud)

视图模型:

private ObservableCollection<User> _users;
private RelayCommand<User> _userSelectedCommand;

public ObservableCollection<User> Users
{
    get { return _users; }
    set
    {
        _users = value;
        RaisePropertyChanged();
    }
}

public RelayCommand<User> UserSelectedCommand
{
    get { return _userSelectedCommand; }
}

protected override sealed void SetCommands() // called in the constructor which is in turned called …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm

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

C++ - 找不到运算符

我有一个向量填充自定义类型的值,并且find()算法抱怨它无法为值比较找到合适的==运算符.我已经实现了这样:

bool Ship::operator==(const Ship& source) {
    return (_type == source._type &&
            _damagedSquares == source._damagedSquares &&
            _orientation == source._orientation && _state == source._state);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了"朋友"方法,但这也不起作用.类本身的结构如下:

class Ship {
private:
    ShipType _type;
    int _damagedSquares;
    ShipOrientation _orientation;
    ShipState _state;

public:
    Ship();
    Ship(ShipType type);
    ~Ship();

    bool operator==(const Ship& source);
};
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

附加信息:

std::vector<Ship> remainingShips;
MultiArray& squares = opponentGridCopy.GetSquares();
for (RowIterator rowIterator = squares.begin(); rowIterator != squares.end();
     ++rowIterator) {
    for (ColumnIterator columnIterator = rowIterator->begin();
         columnIterator != rowIterator->end(); ++columnIterator) {
        Square* current = &(*columnIterator);
        SquareState currentState …
Run Code Online (Sandbox Code Playgroud)

c++ vector operator-overloading

0
推荐指数
1
解决办法
108
查看次数