我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?
我很期待你的回答.
我有几个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)
我不知道是否以及如何在一个动作中调用函数.
我在代码隐藏中创建了一些控件,并希望动态设置它的大小.我可以分配数值System.Windows.GridLength.Auto,但没有相应的"*".
是因为在"*"解析WPF时,来自XAML的内容会被转换为代码吗?
为此提供一些细节:有一个有三行的网格.我希望顶行和底行占用所有空间,而中间行保持自动调整大小.
我正在尝试在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文件,因此我将不得不对每个读取字符串执行转换,但现在,我想从一个文件开始.谢谢.
出于调试目的,我经常将指针值(大多数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).
使用案例:这应该是一个相当普遍的问题.在正常的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) 在我的项目中,我正在使用a QGraphicsScene并在代码中添加/删除项目.
现在,我想QGraphicsItem在添加或删除时收到通知.许多Qt类具有通知信号或至少被调用此类更改的虚函数.我试图避免在许多地方添加许多行代码,这不仅麻烦而且不安全(忘记现在或将来的插入/删除).
我需要一个适用于任何方案的解决方案QGraphicsItem.
这是一个不起作用的事情列表:
QGraphicsScene (如QAbstractItemModel::rowsInserted())的信号- >没有.QGraphicsScene并重载虚拟通知程序函数(如QTabWidget::tabInserted()) - >没有.addItem(),自己发送通知(如QMdiArea::addSubWindow()) - > addItem不是虚拟的,并从构造函数中调用QGraphicsItems.QGraphicsItems- >不知道如何获取新添加的项目,它将sceneEventFilter只能安装在其他项目上QGraphicsItems.itemChange()的QGraphicsItem- > itemChange是不是一个信号和重载QGraphicsItem是不是一种选择.QGraphicsScene(将场景作为私有成员)并且只显示函数addItem和removeItem- >但是QGraphicsItems在那个场景中仍然可以通过scene()函数访问它,所以这个解决方案不够安全.如何获得有关项目更改的通知?
如果有一个我错过的简单方法,请指出我.另外,我非常欣赏这方面的想法.
override说明符防止不覆盖预期的虚拟基本函数(因为签名不匹配).final说明符在派生类中重写无意的功能保护.=>是否有一个说明符(可能first或类似的东西no_override)可以防止覆盖未知的基本函数?
当虚拟函数被添加到基类中时,我想得到编译器错误,该基类具有与派生类中已有的虚函数相同的签名.
编辑4:为了使这个问题简单并且答案相关,这里又是
原始的伪代码
class B : A了private: virtual void fooHasBeenDone() = 0;class C : B 器物 private: virtual void fooHasBeenDone() override { react(); }class A得到一个新的private: virtual void fooHasBeenDone();A::foo可能与原始的不同B::foo.和一个具体的例子
class B : A有virtual void showPath() = 0;一个PainterPathclass C : B 器物 virtual void showPath() override …从我的包装器类开始,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) 我在Q20 4.7.4的VS2010中有一个c ++项目,我经常遇到IntelliSense问题(正如我们所做的那样......).一个特定的问题是有时无法找到函数体(在.cpp文件中).如果我单击该函数体,下拉框(通常显示您所在的函数)为空.
今天我在添加一个foreach()语句(Qt宏Q_FOREACH)后立即注意到了这种行为.然后我用相应的替换了foreach()宏,for(int i = 0; i < ...)并且IntelliSense 再次立即显示该函数.
所以我想知道:
c++ ×5
qt ×4
wpf ×3
c# ×2
code-behind ×2
events ×2
c++11 ×1
casting ×1
destructor ×1
gridlength ×1
inheritance ×1
intellisense ×1
macros ×1
modifiers ×1
pointers ×1
position ×1
qstring ×1
qt4 ×1
signals ×1
styles ×1
unicode ×1
utf-8 ×1
viewport ×1