小编Mar*_*ngs的帖子

您是否需要在析构函数中删除事件处理程序?

UserControls在运行期间使用了一些在我的应用程序中创建和销毁的内容(通过创建和关闭内部带有这些控件的子窗口).
它是一个WPF UserControl并继承自System.Windows.Controls.UserControl.Dispose()我无法覆盖任何方法.
PPMM是一个Singleton具有相同的寿命为我的应用程序.
现在在我的(WPF)的构造函数中UserControl,我添加了一个事件处理程序:

public MyControl()
{
    InitializeComponent();

    // hook up to an event
    PPMM.FactorChanged += new ppmmEventHandler(PPMM_FactorChanged);
}
Run Code Online (Sandbox Code Playgroud)

我习惯在析构函数中删除这样的事件处理程序:

~MyControl()
{
    // hook off of the event
    PPMM.FactorChanged -= new ppmmEventHandler(PPMM_FactorChanged);
}
Run Code Online (Sandbox Code Playgroud)

今天我偶然发现了这件事,并想知道:

1)这是必要的吗?或者GC会照顾它吗?

2)这甚至有用吗?或者我是否必须存储新创建的ppmmEventHandler

我很期待你的回答.

c# wpf events destructor event-handling

51
推荐指数
3
解决办法
3万
查看次数

如何通过样式设置事件功能?

我有几个GUI控件元素,其中一些应该在鼠标交互(MouseEnter,MouseLeave)上生成相同的操作(代码隐藏函数调用).
[edit] 我在我的事件处理程序中执行一些非样式相关的功能.
现在我在每个控件中使用事件属性:

<Button Name="Button" Content="Button 1" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    PreviewMouseDown="Button1_PreviewMouseDown" PreviewMouseUp="Button1_PreviewMouseUp" />
<Button Name="NotInteractingButton" Content="Button 2" 
    /><!-- this button has no MouseOver-effects -->
<ToggleButton Content="ToggleButton" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave"  />
<!-- needs to use IsMouseDirectlyOver on the slider knob... -->
<Slider Name="HorizontalSlider" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" />
<Slider Name="VerticalSlider" Orientation="Vertical" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" />
Run Code Online (Sandbox Code Playgroud)

由于此示例中的许多控件都调用相同的两个函数"GeneralMouseEnter"和"GeneralMouseLeave",因此我希望能够定义一个样式或类似的东西来封装该行为.

[编辑 - 澄清]
这应该成为后来的一种插件.
(将代码和XAML文件包含到任何GUI程序中,并在每个交互式控件元素上设置样式...)

根据我在网络上发现的内容,我可以EventTriggers在此示例中使用:

<Style.Triggers>
  <EventTrigger RoutedEvent="Click">
    <EventTrigger.Actions>
      <BeginAction TargetName="SomeAction" />
    </EventTrigger.Actions>
  </EventTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)

我不知道是否以及如何在一个动作中调用函数.

  • 是否可以通过创建一个带有action + trigger的样式来应用于每个控件来获得此功能?怎么做?
  • 如何为一个控件分配多个样式(用于多个交互事件)?
  • 甚至可能有更简洁的方法来实现这种行为?
  • [编辑]
    如果我想在GUI中的所有滑块上进行鼠标交互怎么办?

c# wpf events styles code-behind

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

如何在代码隐藏中使用WPF的星号大小值?

我在代码隐藏中创建了一些控件,并希望动态设置它的大小.我可以分配数值System.Windows.GridLength.Auto,但没有相应的"*".
是因为在"*"解析WPF时,来自XAML的内容会被转换为代码吗?

为此提供一些细节:有一个有三行的网格.我希望顶行和底行占用所有空间,而中间行保持自动调整大小.

wpf code-behind gridlength

20
推荐指数
1
解决办法
8779
查看次数

在Qt中创建UTF-8文件

我正在尝试在Qt中创建一个UTF-8编码文件.

#include <QtCore>

int main()
{
    QString unicodeString = "Some Unicode string";
    QFile fileOut("D:\\Temp\\qt_unicode.txt");
    if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream streamFileOut(&fileOut);
    streamFileOut.setCodec("UTF-8");
    streamFileOut << unicodeString;
    streamFileOut.flush();

    fileOut.close();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为当QString默认为Unicode时,当我将输出流的编解码器设置为UTF-8时,我的文件将是UTF-8.但它不是,它是ANSI.我做错了什么?我的琴弦有问题吗?你能纠正我的代码来创建UTF-8文件吗?对我来说,下一步将是读取ANSI文件并将其保存为UTF-8文件,因此我将不得不对每个读取字符串执行转换,但现在,我想从一个文件开始.谢谢.

unicode qt4 utf-8

18
推荐指数
3
解决办法
2万
查看次数

如何将指针值转换为QString?

出于调试目的,我经常将指针值(大多数this)输出到qDebug:

qDebug("pointer of current object = 0x%08x",this);,使用"%08x"作为格式字符串,只是this作为参数传递.

如何将指针值转换为QString?

这是我到目前为止所得到的:

char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
Run Code Online (Sandbox Code Playgroud)

但编译器似乎并没有弄清楚如何处理该值.char在这种情况下铸造是否正确?或者更安全的方法是什么?

使用Visual C++和Qt 4.7.4.

编辑

qulonglong按建议使用

qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
Run Code Online (Sandbox Code Playgroud)

产生编译器错误消息(错误C2666).

c++ qstring qt pointers

14
推荐指数
3
解决办法
2万
查看次数

查找QGraphicsItem的屏幕位置

使用案例:这应该是一个相当普遍的问题.在正常的QMainWindow中,QMdiArea与QGraphicsView一起生活在mdiChild中.此视图显示内部带有QGraphicsItems的QGraphicsScene.右键单击其中一个项目可选择(聚焦)项目并打开上下文菜单,该菜单可方便地放置在屏幕坐标处QGraphicsSceneMouseEvent::screenPos().这是按预期工作的.

现在,当用户按下某个键(例如Qt :: Key_Menu)时,我想显示相同的上下文菜单.我知道所选的(聚焦的)项目,我知道显示场景的视图.

所以我的问题是:
获取场景中QGraphicsItem的可见表示的位置(在全局,屏幕坐标中)的正确方法什么?

这是什么不起作用:

QGraphicsItem *item = ...; // is the currently selected item next to which the context menu shall be opened
QGraphicsScene *scene = ...; // is the scene that hosts the item
QGraphicsView *graphicsView = ...; // is the view displaying the scene, this inherits from QWidget

// get the position relative to the scene
QPointF sp = item->scenePos();
// or use
QPointF sp = item->mapToScene(item->pos());

// find the …
Run Code Online (Sandbox Code Playgroud)

c++ qt position viewport qgraphicsitem

12
推荐指数
1
解决办法
1万
查看次数

如何在addItem或itemChange上从QGraphicsScene获取通知?

在我的项目中,我正在使用a QGraphicsScene并在代码中添加/删除项目.

现在,我想QGraphicsItem在添加或删除时收到通知.许多Qt类具有通知信号或至少被调用此类更改的虚函数.我试图避免在许多地方添加许多行代码,这不仅麻烦而且不安全(忘记现在或将来的插入/删除).

我需要一个适用于任何方案的解决方案QGraphicsItem.

这是一个不起作用的事情列表:

  • 连接到QGraphicsScene (如QAbstractItemModel::rowsInserted())的信号- >没有.
  • 继承QGraphicsScene并重载虚拟通知程序函数(如QTabWidget::tabInserted()) - >没有.
  • 继承和重载addItem(),自己发送通知(如QMdiArea::addSubWindow()) - > addItem不是虚拟的,并从构造函数中调用QGraphicsItems.
  • 在新添加的事件上安装事件过滤器QGraphicsItems- >不知道如何获取新添加的项目,它将sceneEventFilter只能安装在其他项目上QGraphicsItems.
  • 连接到itemChange()QGraphicsItem- > itemChange是不是一个信号和重载QGraphicsItem是不是一种选择.
  • 换行QGraphicsScene(将场景作为私有成员)并且只显示函数addItemremoveItem- >但是QGraphicsItems在那个场景中仍然可以通过scene()函数访问它,所以这个解决方案不够安全.

如何获得有关项目更改的通知?

如果有一个我错过的简单方法,请指出我.另外,我非常欣赏这方面的想法.

notifications qt signals qgraphicsitem qgraphicsscene

10
推荐指数
1
解决办法
1433
查看次数

与c ++`override` /`final`说明符相反的是什么?

  • 在c ++ 11中,override说明符防止不覆盖预期的虚拟基本函数(因为签名不匹配).
  • final说明符在派生类中重写无意的功能保护.

=>是否有一个说明符(可能first或类似的东西no_override)可以防止覆盖未知的基本函数?

当虚拟函数被添加到基类中时,我想得到编译器错误,该基类具有与派生类中已有的虚函数相同的签名.


编辑4:为了使这个问题简单并且答案相关,这里又是

原始的伪代码

  • 摘要class B : Aprivate: virtual void fooHasBeenDone() = 0;
  • class C : B 器物 private: virtual void fooHasBeenDone() override { react(); }
  • 现在class A得到一个新的private: virtual void fooHasBeenDone();
  • 但新的A::foo可能与原始的不同B::foo.

和一个具体的例子

  • abstract class B : Avirtual void showPath() = 0;一个PainterPath
  • class C : B 器物 virtual void showPath() override …

c++ inheritance class-hierarchy modifiers c++11

8
推荐指数
1
解决办法
1395
查看次数

为什么static_cast不使用转换运算符指向const?

从我的包装器类开始,Pointer<Base>我只想返回指向const的指针:Base const *.
当转换Pointer<Base>Derived const *我得到编译错误:

错误C2440:'static_cast':'指针'无法转换为'const Derived*'

(翻译自德语VS2012)

struct Base { };

struct Derived : public Base { };

template <typename T>
class Pointer {
public:
    Pointer(T *t = nullptr) : p(t) { }

    //operator T*() { return p; }
    operator T const *() const { return p; }

    template <typename U>
    inline U staticCast() const { return static_cast<U>(d); }

private:
    T *p;
};

int main(int argc, char *argv[]) {
    Derived …
Run Code Online (Sandbox Code Playgroud)

c++ casting implicit-conversion visual-studio-2012

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

为什么Q_FOREACH宏会破坏VS2010的智能感知?

我在Q20 4.7.4的VS2010中有一个c ++项目,我经常遇到IntelliSense问题(正如我们所做的那样......).一个特定的问题是有时无法找到函数体(在.cpp文件中).如果我单击该函数体,下拉框(通常显示您所在的函数)为空.

今天我在添加一个foreach()语句(Qt宏Q_FOREACH)后立即注意到了这种行为.然后我用相应的替换了foreach()宏,for(int i = 0; i < ...)并且IntelliSense 再次立即显示该函数.

所以我想知道:

  1. 有人可以验证这种行为并在评论中告诉我吗?
  2. 为什么会这样?
  3. 是否有一种解决方法可以让我继续使用Q_FOREACH?

c++ macros intellisense qt visual-studio-2010

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